多行数据字段连接成一个字段的方法,需配合group by 使用
select concat_ws(',',collect_list(oid)) as oid_list,tid
from HIVE_TABLE_NAME_XXXX
group by tid
执行结果效果如下
使用`collect_list`获取相同tid行的oid字段,并使用 `concat_ws` 函数拼接这个集合,中间用此处指定的字符串“,”逗号拼接。
collect_list会忽略集合中null值,如果集合内的所有值均为null,那么此时结果是一个空数组。
如果要对结果去重,可以使用collect_set替换collect_list方法
再有就是,只有group by的字段可以直接在select后面使用,其他字段可以使用MAX函数对字段取值,这里和Mysql的 any_value函数有点相似。
如果我们需要得到结果是一个JSON字符串,同样的可以这样操作
select concat('[',concat_ws(',',collect_list(info)),']') as order_json,tid
from
(
select tid,concat('{"tid":',tid,',"oid":',oid,'}') as info
from HIVE_TABLE_NAME_XXXX
)
group by tid
可以得到结果如下,order_json即为所需的json字符串
若需要对同一个tid内的oid按照指定顺序排序,则需要借助
DISTRIBUTE BY column1 SORT BY column1,column2 desc
语句,我们试下改写下上面的sql
select concat('[',concat_ws(',',collect_list(info)),']') as order_json,tid
from
(
select tid,concat('{"tid":',tid,',"oid":',oid,'}') as info
from HIVE_TABLE_NAME_XXXX
DISTRIBUTE BY tid SORT BY tid,oid DESC
)
group by tid
查询结果如下
可以看到确实按照oid降序排序了,这里DISTRIBUTE BY的作用是按照指定的字段分区,并根据后面的SORT BY排序
可以参见https://blog.csdn.net/fantasticqiang/article/details/80769316
如果排序是升序的话,可以用cluster by语句替代
1.DISTRIBUTE BY的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
2.Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
发表评论