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

时间:2015-11-05 16:28:05

标签: hive printf hiveql

我想printf()collect_set()患者数量中的前3位患者。

A 即可。我创建了#34; patient_list"使用collect_set

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"]

即可。然后,我删除了逗号和引号,并用' *' (为了抓住前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,以便只打印审核小组的前三个患者编号。由于患者数量的长度不同,我不能将打印限制在一定长度

由于

1 个答案:

答案 0 :(得分:0)

使用您提供的数据

--------------
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

您可以使用此UDF here将数组截断为所需的长度。 main page上有关于如何构建和使用jar的说明。

<强>查询

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

我必须承认,我有点不清楚printf()如何在此问题中发挥作用,因为查询返回结果并打印出来。另外还要注意,在 A 的查询中,distinct中的collect_set(distinct)是多余的,因为collect_set的目的是收集 distinct 元素。