2019-12-11更新:impala结构化数据库
基于google最新三篇大数据文章,基于hive(提供metadata)的一种更快的数据库。
与Hive主要区别:
- 不走mapreduce并行计算架构,而是采用query解析树结构,节点的数据由下往上拉取,而不是reduce计算完 成之后往下传递,从而降低时间消耗
- 无稳定性保障(默认查询一次是快速的),不支持封装UDF
set hive.default.fileformat=TextFile 转换为文件形式,Hive默认是Sequencefile
hive 查看表容量:通过insert overwrite directory '/path/wenjian',在通过Hadoop,输出路径,可以统计表的大小;
或者通过HDFS去查看表的大小,但是是机架模型,因此考虑到只有1/3的数据量;
hive -e " select concat_ws(',',column1,column2,column3) as alias from tablename">data.csv 处理导出HIVE表文件乱码问题,如果这个方法是用字符串连接的方式,导出数据,需要需要列是string格式,如果不是报错,你需要用cast转换一下;cast(columns as string);
show tables like '*name*' 表名查找,模糊匹配;
Need to specify partition columns because the destination table is partitioned. Error encountered near token;
上述问题需要你 insert into table select * from tablename 改成 insert into table partition(分区) select* from tablename
这样就可以 了;
concat_set与concat_list区别:list可理解为拼接生成列表,而set是集合。因此,list可能出现重复数据,而set不可能出现重复数据;并且,由于concat_set去重性的存在,两者再子表的顺序对结果生成无效,需要重排;
连接的两张表中,拥有相同的字段,导致表不知道连接哪个,比如表a 有key_id,user_id;表b有user_id
你使用 a.key_id=b.user_id 就会报上述错误!
解决方法,alis列名,即(select user_id as key_id from b)c 再使用a.key_id=c.key_id 就可以解决问题了!
set hive.auto.convert.join=true; 在两表连接的时候,通过这个方法,然后查较小的表,提高速度;
更新:set hive.exec.parallel=true 实现多map,缺点会消耗资源,但是能够加速map(在stage 无关联时);
如果想要看数据表的数据,可以通过设置:set hive.fetch.task.conversion=more,加快运行速度,不需要每次都跑map,reduce;
数据导入:
LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15')
Inpanth 后面指的是数据路径, Table 后面是表名, Partition是数据分区;
数据导出:
INSERT OVERWRITE local DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15'
同理,Directory 后是导出路径, select * from table 是需要导出的数据
加快数据处理:增加reduce数量,上次一张200W的表 和一张7000W的表 left join(基本没重合数据),导致太慢了;找了点资料,然后通过增加reduce数量,可以稍微提高一些速度,但是语法是最主要的!
set mapred.reduce.tasks = 2000 # hive增加reduce 数量
分区查看:show partitions tablename
hive instr 判断一个字符串是否在另外一个字符串里面,在;则返回位置,否则返回0;
select instr('abcab','ab') 返回1;即后面ab 在前面字符串里面1的位置;
floor:取整数;浮点型数据取整;取下界,例如floor(3.5) 输出是 3,并非4
ceil:取整数,向上取;取上界,ceil(3.5),输出4;
if函数:select if(1=2,100,200),若为真,取100;若为假,取200;
substr字符串截取:select substr('abcde',2,2) from table;从第二个字符开始,截取两个字符;字符排序编码由1开始,不是0,请记住!
Cast 数据转换 cast('123' as int);将字符串转化成整形;如果转换失败,将返回NULL,并且HIve中判断是否是NULL;
hive 时间戳转换成日期:select from_unixtime(1646464789,'yyyyMMdd'),第一个参数要求为bigint,如果是string类型,可以使用cast(字段名 as bigint)进行转换;