gpt4 book ai didi

map - PigLatin 映射键值

转载 作者:可可西里 更新时间:2023-11-01 15:18:42 24 4
gpt4 key购买 nike

我是第一次使用一些 PigLatin 代码,希望能够通过首先将键值生成为字符数组,然后使用该键来访问 map 中的值。例如,categoryIds 是我的 map ,

catIds = foreach filteredContexts generate elementId,SUBSTRING(categoryAndConfidence,0,2) as catId;
categoryNames = foreach catIds generate elementId, categoryIds#catId as catName;

这是我收到的错误:ERROR 1000:解析时出错。在第 28 行第 64 列遇到“”catId“”。期待其中之一: “无效的” ... ... ... “空”...

我想做的事情是不可能的吗?我是否需要在每次使用 map 时明确说明键值(例如:categoryIds#'51')?

最佳答案

据我所知,Pig 没有提供任何内置的方法来从 map 中获取键值。对于映射字段,您只能使用 SIZE 函数获取其大小,使用 IsEmpty 函数检查它是否为空,或者使用 map_field#'key' 查找给定键的值。

我自己写了一些 UDF 来帮助我更好地处理 map 数据类型。我的一个函数可能对您有用 - MapToBag - 它可以将 map :map[value_type] 转换为包 :bag{:tuple(key:chararray, value:value_type)} 。有了包,你可以得到 key ,或者应用 FLATTEN 操作。

package com.XXX.YYY.ZZZ;

import org.apache.pig.EvalFunc;
import org.apache.pig.FuncSpec;
import org.apache.pig.data.*;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class MapToBag extends EvalFunc<DataBag> {

@Override
public DataBag exec(Tuple input) throws IOException {
if (input == null || input.size() == 0) {
return null;
}

@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) input.get(0);
if (map == null || map.isEmpty()) {
return null;
}

DataBag bag = bagFactory.newDefaultBag();
for (String key : map.keySet()) {
Object value = map.get(key);
Tuple oneKeyTuple = tupleFactory.newTuple(2);
oneKeyTuple.set(0, key);
oneKeyTuple.set(1, value);
bag.add(oneKeyTuple);
}

return (bag.size() == 0) ? null : bag;
}

@Override
public Schema outputSchema(Schema input) {
try {
Schema innerSchema = new Schema();
innerSchema.add(new Schema.FieldSchema("key", DataType.CHARARRAY));
innerSchema.add(getMapValueSchema(input));
Schema tupleSchema = new Schema(new Schema.FieldSchema(null, innerSchema, DataType.TUPLE));
return new Schema(new Schema.FieldSchema(null, tupleSchema, DataType.BAG));
} catch (FrontendException e) {
return new Schema(new Schema.FieldSchema(null, DataType.BAG));
}
}

protected Schema.FieldSchema getMapValueSchema(Schema input) throws FrontendException {
if (input == null || input.size() == 0) {
return null;
}
Schema.FieldSchema mapField = input.getField(0);
if (mapField.type != DataType.MAP) {
return null;
}

Schema valueSchema = mapField.schema;
if (valueSchema == null || valueSchema.size() == 0) {
return null;
}
Schema.FieldSchema valueField = valueSchema.getField(0);
valueField.alias = "value";
return valueField;
}

@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
List<FuncSpec> funcList = new ArrayList<FuncSpec>();
funcList.add(new FuncSpec(this.getClass().getName(), new Schema(new Schema.FieldSchema(null, DataType.MAP))));
return funcList;
}

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

关于map - PigLatin 映射键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952048/

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