Hive Hql基本语法

 Hive官网(HQL)语法手册(英文版):

 https://cwiki.apache.org/confluence/display/Hive/LanguageManual

一、Hive的数据存储

  1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)

  2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

  3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。

      (1):db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

    (2):table:在hdfs中表现所属db目录下一个文件夹

    (3):external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径

        普通表: 删除表后, hdfs上的文件都删了

        External外部表删除后, hdfs上的文件没有删除, 只是把文件删除了

    (4):partition:在hdfs中表现为table目录下的子目录

    (5):bucket:桶, 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件, 会根据不同的文件把数据放到不同的文件中

二、Hive创建数据库操作

#创建:
create (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES] (property_name=value,name=value...)

#显示描述信息:
describe DATABASE|SCHEMA [extended] database_name。

#删除:
DROP DATABASE|SHCEMA [IF EXISTS] database_Name [RESTRICT|CASCADE]

#使用:
user database_name;

1、Hive创建数据表

(1)创建表(DDL操作)

建表语法如下所示:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

   [(col_name data_type [COMMENT col_comment], ...)]  ----指定表的名称和表的具体列信息。

   [COMMENT table_comment]  ---表的描述信息。

   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]  ---表的分区信息。

   [CLUSTERED BY (col_name, col_name, ...)  

   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]   ---表的桶信息。

   [ROW FORMAT row_format]  ---表的数据分割信息,格式化信息。

   [STORED AS file_format]   ---表数据的存储序列化信息。

   [LOCATION hdfs_path]  ---数据存储的文件夹地址信息。

创建数据表解释说明:

1、 CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。hive中的表可以分为内部表(托管表)和外部表,区别在于,外部表的数据不是有hive进行管理的,也就是说当删除外部表的时候,外部表的数据不会从hdfs中删除。而内部表是由hive进行管理的,在删除表的时候,数据也会删除。一般情况下,我们在创建外部表的时候会将表数据的存储路径定义在hive的数据仓库路径之外。hive创建表主要有三种方式,第一种直接使用create table命令,第二种使用create table ... as select...(会产生数据)。第三种使用create table tablename like exist_tablename命令。

2、 EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

3、 LIKE 允许用户复制现有的表结构,但是不复制数据。

4、 ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。

5、 STORED AS

SEQUENCEFILE  |  TEXTFILE  |  RCFILE

如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用STORED AS SEQUENCEFILE

 6、CLUSTERED BY

对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

7、create table命令介绍2

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name] table_name LIKE existing_table_orview_name ---指定要创建的表和已经存在的表或者视图的名称。

[LOCATION hdfs_path] ---数据文件存储的hdfs文件地址信息。

8、CREATE [EXTERNAL] TABLE [IF NOT EXISTS]

[db_Name] table_name ---指定要创建的表名称

...指定partition&bucket等信息,指定数据分割符号。

[AS select_statement] ---导入的数据

CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
STORED AS SEQUENCEFILE;

2、Hive创建数据表解释

# page_view是数据表的名称,注意hive的数据类型和java的数据类型类似,和mysql和oracle等数据库的字段类型不一致。
CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')

#COMMENT描述,可有可无的。
 COMMENT 'This is the page view table'

# PARTITIONED BY指定表的分区,可以先不管。
 PARTITIONED BY(dt STRING, country STRING)

# ROW FORMAT DELIMITED代表一行是一条记录,是自己创建的全部字段和文件的字段对应,一行对应一条记录。
 ROW FORMAT DELIMITED

#FIELDS TERMINATED BY '\001'代表一行记录中的各个字段以什么隔开,方便创建的数据字段对应文件的一条记录的字段。
   FIELDS TERMINATED BY '\001'

# STORED AS SEQUENCEFILE;代表对应的文件类型。最常见的是SEQUENCEFILE(以键值对类型格式存储的)类型。TEXTFILE类型。
STORED AS SEQUENCEFILE;



3、Hive创建数据表之后,load数据

//create & load(创建好数据表以后导入数据的操作如):
hive> create table tb_order(id int,name string,memory string,price double)
    > row format delimited
    > fields terminated by '\t';
    
//从本地导入数据到hive的表中(实质就是将文件上传到hdfs中hive管理目录下)
load data local inpath '/home/hadoop/ip.txt' into table 要导入的表名称;

//从hdfs上导入数据到hive表中(实质就是将文件从原始目录移动到hive管理的目录下)

load data inpath 'hdfs://ns1/aa/bb/data.log' into table 要导入的表名称;

//使用select语句来批量插入数据

insert overwrite table tab_ip_seq select * from 要导入的表名称;


hive> load data local inpath '/home/hadoop/hivetest/phoneorder.data' into table tb_order;

或者

[root@slaver3 hivetest]# hadoop fs -put phoneorder2.data /user/hive/warehouse/tb_order

4、Hive查询,统计



5、External 外部表,优点:

做数据分析的时候,有的数据是业务系统产生的,或者读或者写这个文件,如果的默认的路径,即在配置文件里面写好了,如果做分析的时候数据表导数据,如果将数据表移动了,,业务系统再读这个文件就不存在了,这个时候使用外部表,外部表不要求数据非到默认的路径下面去,数据可以摆放到任意的hdfs路径下面;

创建外部表的语法:

//external外部表
CREATE EXTERNAL TABLE tab_ip_ext(id int, name string,
     ip STRING,
     country STRING)
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 STORED AS TEXTFILE
 LOCATION '/external/user';

//external外部表
//使用关键字EXTERNAL 
CREATE EXTERNAL TABLE 数据表名称(id int, name string,
     ip STRING,
     country STRING)
 ROW FORMAT DELIMITED 
 FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE

#location指定所在的位置:切记,重点。
 LOCATION '/external/user';

猜你喜欢

转载自blog.csdn.net/qq_15300683/article/details/80454350