Hive 使用printf函数打印collect_set数组中有限数量的元素

Hive 使用printf函数打印collect_set数组中有限数量的元素,hive,printf,hiveql,Hive,Printf,Hiveql,我只想打印患者编号集合中的前3名患者 A.我已使用收集集创建了患者列表 collect_set(distinct patient_seq) AS patient_list 这将生成长度不同的4、5或6位数的患者编号数组 例如: ["16189","26599","406622","419117","5551"] ["223587","224663","232072","326504","433430","436673","54540","58188","74118"] B.然后我去掉逗号和引

我只想打印患者编号集合中的前3名患者

A.我已使用收集集创建了患者列表

collect_set(distinct patient_seq) AS patient_list
这将生成长度不同的4、5或6位数的患者编号数组

例如:

["16189","26599","406622","419117","5551"]
["223587","224663","232072","326504","433430","436673","54540","58188","74118"]
B.然后我去掉逗号和引号,用“*”分隔,以便在下一步中仅抓住前3名患者:

concat_ws('*', patient_list) AS pat_list
这将产生:

16189*26599*406622*419117*5551
223587*224663*232072*326504*433430*436673*54540*58188*74118
C.我尝试使用SUBSTRING_INDEX创建一个新的变量pat_list_short,该变量仅包含前3名患者,但该函数在hive 1.1.0中不受支持,直到1.3.0才受支持

substring_index(pat_list, '*', 3) AS pat_list_short
我还有别的选择吗

我想使用%s将pat_list_short输入到PRINTF中,以便只打印出前三个患者编号供审查团队使用。由于患者数量的长度不同,我不能将打印限制在某一长度


感谢使用您提供的数据

--------------
key  |  pat_id
--------------
1       16189
1       26599
1       406622
1       419117
1       5551
2       223587
2       224663
2       232072
2       326504
2       433430
2       436673
2       54540
2       58188
2       74118
可以使用此选项将数组截断为所需的长度。这里有关于如何构建和使用jar的说明

查询:

输出:


我必须承认,当查询返回结果并打印时,我对printf在这个问题中的作用有点不清楚。还需要注意的是,在A中的查询中,collect\u setdistinct是多余的,因为collect\u set的目的是收集不同的元素。

感谢GoBrewers。之所以使用打印,是因为我们有一段文字,其中pat_list_short只是需要打印以供客户审查的许多数据点之一。我将尝试trunc_阵列。我昨天的工作是:选择业务、prov、CONCAT_WS',排序数组collect_SETpatient_seq作为patseq_列表,从SELECT DISTINCT Biz、prov、patient_seq、按业务划分的行数、按患者排序作为pat_seq从pat_表a中选择pat_seq_顺序
add jar /path/to/jar/brickhouse-0.7.1.jar;
create temporary function trunc_array as 'brickhouse.udf.collect.TruncateArrayUDF';

select key
  , concat(' ', trunc_array(collect_set( pat_id ), 3)) pat_list_short
from db.tbl
group by key
----------------------
key  |  pat_list_short
----------------------
1       5551 26599 16189
2       232072 58188 223587