我尝试使用FOREACH .. GENERATE
语句生成一个唯一值为单列元组的关系。为了便于说明,我尝试执行以下操作:
x = LOAD 'data.json' USING JsonLoader('a:chararray, b:chararray') AS (a:chararray, b:chararray);
y = foreach x generate (a) as value: (a: chararray);
但是,此代码会产生以下错误:
Incompatable field schema: declared is "value:tuple(a:chararray)", infered is "a:chararray"
将(a)
包含在更多括号中没有任何区别。使用tuple(a)
是语法错误,因为tuple
语法仅在类型的上下文中有效。
然而,修改代码稍有作用:
y = foreach x generate (a, 0) as value: (a: chararray, b: int);
这表明在语法上没有办法在Pig中创建单值元组。这真是一种耻辱 - 这是一种非常有用的模式。
有没有办法在Pig中创建一个我失踪的单列元组?
答案 0 :(得分:2)
生成 a 的方式不正确。它应该如下:
x = LOAD 'data.json' USING JsonLoader('a:chararray, b:chararray') AS (a:chararray, b:chararray);
y = foreach x generate (a) as value:chararray;
dump y;
如果要生成元组,可以使用TOTUPLE内置UDF
y = foreach x generate TOTUPLE(a) as value:(a:chararray);
您的代码中的问题是,您有chararray并尝试将其转换为元组。 LHS数据类型应与RHS兼容/等于执行数据类型转换。