hive操作

创建一个内部表:

hive> CREATE TABLE IF NOT EXISTS student1 (sno INT,name STRING,age INT,sex STRING)
       > ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE;

 

 查看

hive> show tables;

 

 创建外部表:

hive> CREATE EXTERNAL TABLE IF NOT EXISTS student2 (sno INT,sname STRING,age INT,sex STRING)
  > ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
  > STORED AS TEXTFILE LOCATION '/user/external';

 

 查询

 

 

删除表test1表

 

 查看表结构

 

 添加字段并查看表结构

 

 

 

 修改表名

 

 查看修改

 

 修改回原来的

 

 创建和已知表结构相同的表

 

 查看表结构

 

 

 加载本地数据

 

 

 查看

 

 加载HDFS中的数据

 

 

 单表插入

先创建表

 

 查看表结构是否相同

 

 将student1中的数据插入student11 

hive> INSERT OVERWRITE TABLE student111 SELECT * FROM student11;

 查看

 

 多表插入

创建表

 

 将student1中的数据同时插入student3和student4

hive> FROM student1 INSERT OVERWRITE TABLE student3 SELECT *
> INSERT OVERWRITE TABLE student4 SELECT *;

 

 

 

 

 查询某个字段

 where条件查询

 

 all和distinct的区别:

 

 

 

 

 limit限制查询条数

 

 

 group by分组查询的使用:

创建表

 导入数据

 

 查看

 

 计算表的行数

 创建去重后存放数据的表

将去重后的数据导入group_gender_sum表

hive> INSERT OVERWRITE TABLE group_gender_sum SELECT group_test.gender, COUNT (DISTINCT
group_test.uid) FROM group_test GROUP BY group_test.gender;

 注意:聚合操作可以同时进行多个操作,但是不能有两个聚合操作有不同的distinct列。

下面给出测试:

先创建一个表:group_gender_agg

将group_test聚合后的数据插入到group_gender_agg

hive> INSERT OVERWRITE TABLE group_gender_agg SELECT group_test.gender,COUNT(DISTINCT gr
oup_test.uid),COUNT(*),sum(DISTINCT group_test.uid) > FROM group_test GROUP BY group_test.gender;

下面的查询就是错误的,不能包含多个distinct。不能通过同时操作两个不同的列。

hive> INSERT OVERWRITE TABLE group_gender_agg
> SELECT group_test.gender,COUNT(DISTINCT group_test.uid),COUNT(DISTINCT group_test.ip)
> FROM group_test > GROUP BY group_test.gender;

 

 ORDER BY 排序查询

ORDER BY 会对输入做全局排序,这样就只有一个reduce,当输入数据规模较大时需要耗费较长的计算时间。(因为多个reduce是不能保证全局有序的)

使用 ORDER BY 查询的时候,为了优化查询速度,使用hive.mapred.mode属性。

hive.mapred.mode=nonstrict;(defult value/默认值)

 hive.mapred.mode=strict;

这里与数据库中的ORDER BY的区别在于, hive.mapred.mode=strict模式下必须制定limit,否则报错。

hive> set hive.mapred.mode=strict;
hive> SELECT * FROM group_test ORDER BY uid limit 5;

 SORT BY 查询

SORT BY不会受到hive.mapred.mode的值是否为strict和nonstrict的影响。

SORT BY的数据只能保证在同一个reduce中的数据可以按照制定字段排序。

使用SORT BY可以指定执行的reduce的个数(set mapred.reduce.tasks=<number>).可以输出更多的数据。

对输出的数据再执行归并排序,即可以得到全部结果。

hive> set hive.mapred.mode=strict;
hive> SELECT * FROM group_test SORT BY uid;

DISTRIBUTE BY排序查询

按照指定的对数据划分到不同的输出reduce文件中(控制map的输出在reducer是如何划分的)

 

我们所有的uid相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by uid(这个肯定是全局有序的,因为相同的商户会放到同一个reducer去处理)。这里需要注意的是distribute by必须要写在sort by之前。

cluster by查询

 cluster by的功能就是distribute by和sort by相结合

 

 注意:注意被cluster by指定的列只能是降序,不能指定asc和desc。

原文地址:https://www.cnblogs.com/lyywj170403/p/9429345.html