我想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,以便只打印审核小组的前三个患者编号。由于患者数量的长度不同,我不能将打印限制在一定长度
由于
答案 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 元素。