最近在研究hive的一些基本的使用和操作,发现有些语句的使用和一般的sql还有一定的差别。网上的文章还是比较杂乱,因此我在这里进行一些总结,扩展。
在指定位置建库建表:
create database test_db location ‘/dataManage/company/test_db’;
create table test_db .test2(a int,b int,c int,d int,e int) location ‘/dataManage/company/test_db/test2’;
因为hive采用hdfs作为储存,采用pgsql作为元数据库。指定位置是hdfs目录的位置。
hive导入(插入)数据
通行的导入方法有文件导入,hdfs导入,还有mysql等数据库导入,以及一条条写入数据。其他方式导入的时候,容易在行分隔符中出现问题,最直接的办法就是一条条写入检查测试数据:
insert into test2 values(1,3,4,6,7);
导入文件插入数据,将hdfs或者路径下的文件导入hive表中,特别需要注意文件的分隔方式和hive的分隔字段方式是否相同,建表的字段分隔方式是否同导入文件相同。(我这边就遇见默认建表导入数据字段不匹配的问题。
导入分为两种,一种是加载 load 一种是重写overwrite。下面是一些demo
该行语句是从hdfs导出文件到hive
将文件放入hdfs的语句和将hdfs数据导入hive的语句:
hadoop fs -put test.txt /tmp
load data inpath 'test.txt' into table test;
将文件直接导入hive,带有local的为本地文件系统:
load data local inpath '/tmp/test.txt' into table test;
加载时候注意文件的分隔符,容易出现所有列写在第一列,或者插入为null的情况,以下为对该种情况的优化:先建立指定间隔符的临时表,导入数据到正式表:
创建临时表
create table test.datatest_his (num1 double,num2 double,num3 double,num4 double,num5 double,num6 double,num7 double,num8 double,num9 double,num10 double,num11 double) row format delimited fields terminated by '\t';
导入过程
hive -e "truncate table test.${v_name};truncate table test.${v_name}_his;load data inpath '/tmp/data/${v_name}.txt' overwrite into table test.${v_name}_his;"
hive -e "
insert into table test.${v_name}
select num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11
from test.${v_name}_his a
DISTRIBUTE BY rand();" 2>&1 | tee -a /tmp/hive_info.log
hive导出数据
通常采用语句和脚本结合的方法,将数据查询出来后调整格式,输出成CSV的语句
hive -e "select code,time,value from test.f_all_point_data where code='01' and group by code,time,value;" | sed 's/\t/,/g' >2021.csv
hive的查询
同导出,计划会补充一些hive的优化