hive语句中的日常笔记

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。

你可能感兴趣的:(日常记录)