load data local inpath 'file_path' into table tbname;
在HDFS上看效果
11464886-0134b7d79db2d07f.png
建分区表
分区的意义在于将数据分散到子目录存储,以便于查询时让数据读取范围更精准。
create table t_test1(id int,name string,age int,create_time bigint) partitioned by (day string,country string) row format delimited fields terminated by '\001';
插入数据到指定分区:
hive> load data [local] inpath '/data/path1' [overwrite] into table t_test1 partition(day='2019-10-14',country='China'); hive> load data [local] inpath '/data/path2' [overwrite] into table t_test1 partition(day='2019-10-15',country='China'); hive> load data [local] inpath '/data/path3' [overwrite] into table t_test1 partition(day='2019-10-16',country='England');
导入完成后,形成的目录结构如下:
/user/hive/warehouse/db1.db/t_test1/day=2019-10-14/country=China/... /user/hive/warehouse/db1.db/t_test1/day=2019-10-15/country=England/... /user/hive/warehouse/db1.db/t_test1/day=2019-10-16/country=China/...
注意:分区中的字段不能是表中已存在字段
查询 2019-10-15 数据:
select from t_test1 where day='2019-10-15'
这样MapReduce程序就只会去查 day='2019-10-15' 子目录的文件数据。
表定义的修改:改表名、增加列,删除列,修改列定义.......
DML操作
基本查询语法跟标准sql基本一致
代码语言:javascript
复制
FROM T1
JOIN T2
WHERE CONDITION
GROUP BY FILEDS
HAVING CONDTION
ORDER BY FIELDS DESC|ASC
各类JOIN语法跟SQL也基本一致,不过HIVE有一个自己的特别的JOIN: LEFT SEMI JOIN
hive在1.2.0之前不支持“不等值”join,但在1.2.0后支持不等值join,只是语法必须按如下形式写:
SELECT A.*,B.* from A,B WHERE A.ID>B.ID;
各类流程控制语句根SQL也基本一致:
case when l.userid is null
then concat('hive',rand())
when l.userid > 20
then concat('hive',rand())
else l.userid