hive 学习心得和日常填坑

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)进行转换;

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值