gpt4 book ai didi

hadoop - 收集到 Hive 中的 map

转载 作者:可可西里 更新时间:2023-11-01 14:17:27 24 4
gpt4 key购买 nike

我有一个 Hive 表,例如

id  |  value
-------------
A 1
A 2
B 3
A 4
B 5

本质上,我想模仿 Python 的 defaultdict(list) 并创建一个以 id 为键,以 value 为值的映射。

查询:

select COLLECT_TO_A_MAP(id, value)
from table

输出:

{A:[1,2,4], B:[3,5]}

我尝试使用 klout's CollectUDAF() 但看起来这不会将值附加到数组,它只会更新它们。有什么想法吗?

编辑:这里有一个更详细的描述,这样我就可以避免在 Hive 文档中引用我尝试函数的答案。假设我有一张 table

num    |id    |value
____________________
1 A 1
1 A 2
1 B 3
2 A 4
2 B 5
2 B 6

我正在寻找的是提供此输出的 UDAF

num     |new_map
________________________
1 {A:[1,2], B:[3]}
2 {A:[4], B:[5,6]}

针对这个查询

select num
,COLLECT_TO_A_MAP(id, value) as new_map
from table
group by num

有一个解决方法可以实现这一点。它可以通过在查询中使用 Klout 的(参见上面引用的 UDAF)CollectUDAF() 来模拟,例如

add jar '~/brickhouse/target/brickhouse-0.6.0.jar'
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';

select num
,collect(id_array, value_array) as new_map
from (
select collect_list(id) as id_array
,collect_list(value) as value_array
,num
from table
group by num
) A
group by num

但是,我宁愿不写嵌套查询。

编辑#2

(正如我原来的问题中所提到的)我已经尝试过使用 Klout 的 CollectUDAF(),即使在您向它传递两个参数并创建 map 的情况下也是如此.输出是(如果在我的第一次编辑中应用于数据集)

1    {A:2, B:3}
2 {A:4, B:6}

如我最初的问题所述,它不会将值收集到数组中,它只会收集最后一个值(或更新数组)。

最佳答案

在 Brickhouse ( http://github.com/klout/brickhouse ) 中使用收集 UDF

这正是您所需要的。如果使用一个参数,Brickhouse 的“collect”返回一个列表,如果使用两个参数,则返回一个映射。

关于hadoop - 收集到 Hive 中的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com