Hive-笔记(2)

Posted by hydra on 2019-12-22

Hive分组,列值拼成字符串

这个之前其实已经提到过了,这次写文档遇到个需求,再巩固一下写法。

cd_var cd_var_nm
岳阳市 岳阳县
岳阳市 平江县
岳阳市 湘阴县
岳阳市 华容县

省份、地市、区县加起来太多,写文档的时候,直接按着以上格式排列的话,太占地方了,需要处理如下

cd_var cd_var_nm
岳阳市 岳阳县,平江县,湘阴县,华容县

HiveSQL直接在平台表处理后,全部拷贝出来就行:

1
2
3
4
5
6
7
with a as(
select city,district from mlads.ads_idx_value_tol
group by city,district
)
select city,concat_ws(',',collect_set(district)) from a
group by city
order by city

Hive排序语句Order by问题小记

在hive里,order by语句是最后的reduce任务,它输入是接受之前的SELECT列,
所以在编写SQL语句,要注意在HIVE里order by与传统关系数据库不太一样。
hive的order by列必须存在在SELECT语句里,SELECT语句里没有的列,不能进行order by,会报错,
即使该列在之前的结果集里存在。

Hive数值型数据转换为String类型问题小记

在HIVE里有些情况下,将数值类型转换成Varchar或者直接插入到目标表String类型的列
数值类型会自动转变为科学计数,然后存储为字符串,这样无论在前台展示或者ETL的时候都不方便。
ETL的时候,走JDBC,会有一部分可以转回为数值,BDM下推spark优化,走sqoop的时候,表现为科学计数的字符串无法直接转回数值。

解决办法:
SELECT CAST(COL AS decimal(18,2))

将列转换为decimal(18,2),测试之下,暂时解决了问题。

因为数据并不大,而且转换类型时也不是全部变成了科学计数,所以有些疑惑这种情况,经过推测,可能与计算数据里有NULL值相关。