猪 JsonLoader() 错误?
Pig JsonLoader() bug?
我正在尝试用 pig 加载 json 文件。我可以成功加载文件,但是我发现了一个错误。
schema:
id,name,brand,color
数据:
{"id":2561,"name":"abc","brand":"Levis","color":"Blue"}
{"id":2562,"brand":"Adidas","color":"Black"}
{"id":2563,"name":"edf","brand":"Nike","color":"White"}
代码:
raw = LOAD '$INPUT_PATH' USING JsonLoader('
id:chararray,
name:chararray,
brand:chararray,
color:chararray
');
x = foreach raw generate id,brand;
dump x;
如果特定原始文件不包含架构中定义的所有字段,则结果是错误的:(第二个原始文件应该是阿迪达斯而不是黑色)
(2561,Levis)
(2562,Black)
(2563,Nike)
是否有解决上述问题的方法?
提前致谢
我建议您使用 elephantbird
而不是 JsonLoader
。 Elephantbird
将以 key/value pair(i.e map)
的形式存储输入 json,即使输入 json 中缺少某些字段,也很容易提取所需的字段。
下载两个 jar 文件(elephant-bird-pig-4.1.jar
和 elephant-bird-hadoop-compat-4.1.jar
)并尝试以下方法。
input.json
{"id":2561,"name":"abc","brand":"Levis","color":"Blue"}
{"id":2562,"brand":"Adidas","color":"Black"}
{"id":2563,"name":"edf","brand":"Nike","color":"White"}
PigScript:
REGISTER /tmp/elephant-bird-pig-4.1.jar;
REGISTER /tmp/elephant-bird-hadoop-compat-4.1.jar;
A = LOAD 'input.json' USING com.twitter.elephantbird.pig.load.JsonLoader() AS myMap;
B = FOREACH A GENERATE myMap#'id' AS ID,myMap#'brand' AS brand;
DUMP B;
输出:
(2561,Levis)
(2562,Adidas)
(2563,Nike)
我正在尝试用 pig 加载 json 文件。我可以成功加载文件,但是我发现了一个错误。
schema:
id,name,brand,color
数据:
{"id":2561,"name":"abc","brand":"Levis","color":"Blue"}
{"id":2562,"brand":"Adidas","color":"Black"}
{"id":2563,"name":"edf","brand":"Nike","color":"White"}
代码:
raw = LOAD '$INPUT_PATH' USING JsonLoader('
id:chararray,
name:chararray,
brand:chararray,
color:chararray
');
x = foreach raw generate id,brand;
dump x;
如果特定原始文件不包含架构中定义的所有字段,则结果是错误的:(第二个原始文件应该是阿迪达斯而不是黑色)
(2561,Levis)
(2562,Black)
(2563,Nike)
是否有解决上述问题的方法?
提前致谢
我建议您使用 elephantbird
而不是 JsonLoader
。 Elephantbird
将以 key/value pair(i.e map)
的形式存储输入 json,即使输入 json 中缺少某些字段,也很容易提取所需的字段。
下载两个 jar 文件(elephant-bird-pig-4.1.jar
和 elephant-bird-hadoop-compat-4.1.jar
)并尝试以下方法。
input.json
{"id":2561,"name":"abc","brand":"Levis","color":"Blue"}
{"id":2562,"brand":"Adidas","color":"Black"}
{"id":2563,"name":"edf","brand":"Nike","color":"White"}
PigScript:
REGISTER /tmp/elephant-bird-pig-4.1.jar;
REGISTER /tmp/elephant-bird-hadoop-compat-4.1.jar;
A = LOAD 'input.json' USING com.twitter.elephantbird.pig.load.JsonLoader() AS myMap;
B = FOREACH A GENERATE myMap#'id' AS ID,myMap#'brand' AS brand;
DUMP B;
输出:
(2561,Levis)
(2562,Adidas)
(2563,Nike)