Hive开发问题汇总

简介: 总结一下平时hive开发中遇见的常见问题,供大家参考

一、group by操作后将其他字段串接

select id,concat_ws('|', collect_set(name)) from tmp_test group by id;

collect_set 是 Hive 内置的一个聚合函数, 它返回一个消除了重复元素的对象集合, 其返回值类型是 array,HIve group by操作后将其它字段拼接mysql中使用的是group_concat(字段,‘分隔符’)

//第一种是正确用法

select id,group_concat(字段 separator ';') from table_name group by id;  


//该种方法放回的分隔符会带上,分隔符,最终分隔符是;

select id,group_concat(字段,';') from aa group by id;


--- 默认的分隔符是","

select id,group_concat(name separator ';') from table_name group by id;

--- 如果要对name去重

select id,group_concat(distinct name) from table_name group by id;

--- 如果还想对name排序

select id,group_concat(name order by name desc) from table_name group by id;  

presto中使用的是array_distinct或者array_join(array_agg(字段), ‘,’);

array_join(array_agg(name), ',', 'null') as names;

二、group by 操作时ParseException line 7:22 missing ) at ‘,’ near ‘’

HIve自身的bug,需要在每个子查询后面加上别名并且 group by 后面多个字段时,第一个字段不可以在表名,建议去掉括号;

select a,b,c

from (select a,b,c

     from (select a,b,c

           from table) a

     where no = 1) b

group by a;


SELECT table1.a,

      b, d

      SUM(tab1.c)

FROM table1 join table2 on tab1.a = tab2.b

GROUP BY table1.a,b, d


GROUPING SETS ((b, tab1.a, d))

三、hive和presto的一些对比

处理json数据时,presto用的是json_extract_scalar,hive用的是get_json_object

二者的取交集都是intersect;

四、hive和presto的转换时间戳对比

标准时间格式——时间戳

hive:select unix_timestamp(cast (‘2017-08-30 10:36:15’ as timestamp));

presto:select to_unixtime(cast (‘2017-08-30 10:36:15’ as timestamp));

时间戳——标准时间格式

presto:select format_datetime(from_unixtime(1510284058),‘yyyy-MM-dd HH:mm:ss’);

hive:select from_unixtime(1323308943123,‘yyyy-MM-dd HH:mm:ss’);

其中会遇到将字符串的时间戳转换为数值类型,hive和presto中都提供了cast转换cast(value as type) type显式转换一个值的类型。可以将varchar类型的值转为数字类型,反过来转换也可以。 try_cast(value as type) type与cast类似,不过,如果转换失败会返回null,这个只有presto有另外需要注意的是hive中的int类型是就是int,而presto中是包装类型Integer,如果cast的type写错也会报错;

五、hive随机取数

distribute by rand()sort by rand() limit 100;

六、hive中的like语句无法匹配下划线

1、当无法匹配下划线的字段时,应该使用“`”对字段进行引用;

2、无法匹配like子句内容时,此时需要对like后面的字符串添加转义字符,比如like ‘%_abc_%’,于是sql判断的是包含_abc_内容的数据;

七、海量数据取差集

比较优化的方法是类似如下,取join之后,取右表中的值为空的结果数据,速度提升N倍

select count(*)

from a

left join b on a.id=b.id

where a.is_del=1

and b.id is null

;

八、truncate partition、drop partition 区别

功能:两者都用于删除数据,即将对应的partition的数据文件删除;

不同点:

truncate partition 只删除数据文件,保存在mysql中的metadata不会被删除;

drop partition 只删除数据文件且删除在mysql中的metadata;

TRUNCATE TABLE table_name PARTITION (dt='2022-05-01');

ALTER TABLE table_name DROP PARTITION (partition_date='2022-05-01');

九、hive中去重,并保留唯一值

使用row_number()函数:

row_number()over (partition by id order by time desc) num 取num=1 的

意思是先根据id进行分组,并在分组内部按time降序排序,row_number()函数计算的值就表示某个id组内部排序后的顺序编号(该编号在一个组内是连续并且唯一的) ,所以最后直接取每个分组内的第一个(num=1)即可;

十、identifiers must not start with a digit; surround the identifier with double quotes

或许你尝试了很多遍也没有解决这个问题,甚至没有看懂这句话,没关系,现在你懂了因为你在命名的时候用的是类似“7days“这样数字开头英文结尾的,sql里面可以别名里含有下划线和数字,但一定不能用数字开头取别名,改个名字就好。

十一、sql做left join 操作时,on两边都是null值时,所有数据被过滤

当做join操作时,如果出现null值,可能会导致没有数据,此时需要将null字段设置为默认值

比如 presto中coalesce(字段,‘null’)。

十二、hive中的行转列和列转行

列转行用 lateral view explode:

select id,name,project_ids

from table_name a

lateral view explode(split(a.project_id,','))  b AS project_ids

;

行转列用以下函数:

concat(string1,string,...)  //连接括号内字符串,数量不限。

concat_ws(separator,string1,string2,...)  //连接括号内字符串,数量不限,连接符为separator。

collect_set(col)  //此函数只接受基本类型,主要是将字段的值进行去重汇总,产生array类型字段。

目录
相关文章
|
2月前
|
SQL JavaScript 前端开发
用Java来开发Hive应用
用Java来开发Hive应用
36 7
|
2月前
|
SQL JavaScript 前端开发
用Java、Python来开发Hive应用
用Java、Python来开发Hive应用
33 6
|
6月前
|
存储 SQL JSON
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day02】——Hive2
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day02】——Hive2
59 0
|
6月前
|
SQL 存储 大数据
大数据开发岗面试30天冲刺 - 日积月累,每日五题【Day01】——Hive1
大数据开发岗面试30天冲刺 - 日积月累,每日五题【Day01】——Hive1
80 0
|
SQL 分布式计算 运维
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档
上一篇文章介绍了sqoop全量同步数据到hive, 本片文章将通过实验详细介绍如何增量同步数据到hive,以及sqoop job与crontab定时结合无密码登录的增量同步实现方法。
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档
|
SQL 运维 分布式计算
【大数据开发运维解决方案】Sqoop全量同步mysql/Oracle数据到hive
前面文章写了如何部署一套伪分布式的handoop+hive+hbase+kylin环境,也介绍了如何在这个搭建好的伪分布式环境安装配置sqoop工具以及安装完成功后简单的使用过程中出现的错误及解决办法, 接下来本篇文章详细介绍一下使用sqoop全量同步oracle/mysql数据到hive,这里实验采用oracle数据库为例,
【大数据开发运维解决方案】Sqoop全量同步mysql/Oracle数据到hive
|
SQL 分布式计算 运维
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
前面几篇文章详细介绍了sqoop全量增量导入数据到hive,大家可以看到我导入的数据如果有时间字段的话我都是在hive指定成了string类型,虽然这样可以处理掉时间字段在hive为空的问题,但是在kylin创建增量cube时需要指定一个时间字段来做增量,所以上面那种方式不行,这里的处理方式为把string改成timestamp类型,看实验:
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
|
SQL 运维 Oracle
【大数据开发运维解决方案】Oracle通过sqoop同步数据到hive
将关系型数据库ORACLE的数据导入到HDFS中,可以通过Sqoop、OGG来实现,相比较ORACLE GOLDENGATE,Sqoop不仅不需要复杂的安装配置,而且传输效率很高,同时也能实现增量数据同步。 本文档将在以上两个文章的基础上操作,是对第二篇文章环境的一个简单使用测试,使用过程中出现的错误亦可以验证暴漏第二篇文章安装的问题出现的错误,至于sqoop增量同步到hive请看本人在这篇文章之后写的测试文档。
【大数据开发运维解决方案】Oracle通过sqoop同步数据到hive
|
SQL 运维 Oracle
【大数据开发运维解决方案】Sqoop增量同步Oracle数据到hive:merge-key再次详解
这篇文章是基于上面连接的文章继续做的拓展,上篇文章结尾说了如果一个表很大。我第一次初始化一部分最新的数据到hive表,如果没初始化进来的历史数据今天发生了变更,那merge-key的增量方式会不会报错呢?之所以会提出这个问题,是因为笔者真的有这个测试需求,接下来先对oracle端的库表数据做下修改,来模拟这种场景。
【大数据开发运维解决方案】Sqoop增量同步Oracle数据到hive:merge-key再次详解
|
SQL 分布式计算 Java
hive中开发、使用udf
我们在使用hive时难免会碰到hive的函数解决不了的操作,这时我们就可以开发UDF函数去解决复杂的问题
481 0
hive中开发、使用udf