gpt4 book ai didi

map - pig 中 map 的组键值

转载 作者:行者123 更新时间:2023-12-04 15:24:57 25 4
gpt4 key购买 nike

我是 Pigscript 的新手。说,我们有一个文件

[a#1,b#2,c#3]
[a#4,b#5,c#6]
[a#7,b#8,c#9]

pig 脚本
A = LOAD 'txt' AS (in: map[]);
B = FOREACH A GENERATE in#'a';
DUMP B;

我们知道我们可以获取输入键的值。在上面的示例中,我使用了包含与键 相关的值的映射。 “一个” .
假设我不知道键,我想根据关系中的键对值进行分组并将其转储。
(a,{1,4,7})
(b,{2,5,8})
(c,{3,6,9})

pig 允许这样的操作还是需要使用UDF?请帮我解决这个问题。谢谢。

最佳答案

您可以创建自定义 UDF将 map 转换为包(使用 Pig v0.10.0):

package com.example;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.BagFactory;
import org.apache.pig.data.DataBag;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;

public class MapToBag extends EvalFunc<DataBag> {

private static final BagFactory bagFactory = BagFactory.getInstance();
private static final TupleFactory tupleFactory = TupleFactory.getInstance();

@Override
public DataBag exec(Tuple input) throws IOException {
try {
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) input.get(0);
DataBag result = null;
if (map != null) {
result = bagFactory.newDefaultBag();
for (Entry<String, Object> entry : map.entrySet()) {
Tuple tuple = tupleFactory.newTuple(2);
tuple.set(0, entry.getKey());
tuple.set(1, entry.getValue());
result.add(tuple);
}
}
return result;

}
catch (Exception e) {
throw new RuntimeException("MapToBag error", e);
}
}
}

然后:
B = foreach A generate 
flatten(com.example.MapToBag(in)) as (k:chararray, v:chararray);
describe B;
B: {k: chararray,v: chararray}

现在按键分组并使用嵌套的 foreach:
C = foreach (group B by k) {
value = foreach B generate v;
generate group as key, value;
};
dump C;
(a,{(1),(4),(7)})
(b,{(2),(5),(8)})
(c,{(3),(6),(9)})

关于map - pig 中 map 的组键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476929/

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