1、列转行
需要解决的场景:某一列变量类型为字符串,现在需要将这这一列字符串的内容进行操作,并且将操作之后的结果生成新的列
SELECT newcon_name
FROM table_name
LATERAL VIEW EXPLODE(对列的操作,比如SPLIT(col_name,',')) newtable as newcon_name
explode函数实现将list的值展开,获取到每个元素,并返回成多个列,比如说select explode(split('我 爱 中 国', ' '))
得到的结果是:
col |
---|
我 |
爱 |
中 |
国 |
而lateral view 是实现将这些值和原来的主键匹配起来。比如说原始表为
user | tag |
---|---|
小明 | 我 爱 中 国 |
小红 | 你 好 |
那么select user, tags from t lateral view explode(split(tag, ' ')) t1 as tags
得到的结果是:
user | tags |
---|---|
小明 | 我 |
小明 | 爱 |
小明 | 中 |
小明 | 国 |
小红 | 你 |
小红 | 好 |
2、json数据的读取
方法一:
get_json_object(json变量名, '$.需要提取的关键词')
- 缺点:
这种方法一次只能解析json中的一个值 - 优点:
可以对json的多层关系进行解析
1.当解析的内容是一个list的时候,可以通过 '$.需要提取的value的json的key值[i]‘实现提取list中的第i个索引处的值;
2.当解析的内容还是一个json的时候,可以通过’$.需要提取的value的json的key值.key值’实现提取更深层的值。
方法二:
json_tuple(json变量名, '需要提取的关键词1', '需要提取的关键词2',......) AS 给关键词1的重命名, 给关键词2的重命名,......
一般情况下,这种方法会和lateral view 一起使用,变成:select f1, f2 from table lateral view json_tuple(json, ‘f1’, ‘f2’) t as f1, f2
- 优点:
一次可以实现同时解析该json字段下的多个关键词 - 缺点:
无法对json的多层嵌套关系进行解析
3、随机选取样本进行处理
select ...... from ...... order by rand() limit 需要选取的数量
实现从select中进行随机选取指定数量的记录
4、hive 中的排序
order by:全局排序
sort by:只在各个reduce上进行排序,也就是说不能保证全局有序
distribute by:控制map端数据如何拆分给reduce端。因此通常将distribute by和sort by一起使用
cluster by:同时实现了distribute by+sort by的功能,排序是倒叙,不能指定asc或desc。