5

私は現在、JSON ファイルを操作し、PIG スクリプトを使用してデータを処理し始めています。私は Pig バージョン 0.9.3 を使用しています。PIG スクリプトで json ファイルを読み込んで処理するのに役立つと思われる PiggyBank に出会いました。

ANT を使用して piggybank.jar をビルドしました。その後、Java ファイルをコンパイルし、piggybank.jar を更新しました。指定されたサンプル json ファイルを実行しようとしていました。

次のように、単純な PIGSCRIPT とそれぞれの JSON を作成しました。

REGISTER piggybank.jar
a = LOAD 'file3.json' using org.apache.pig.piggybank.storage.JsonLoader() AS (json:map[]);
b = foreach a GENERATE flatten(json#'menu') AS menu;
c = foreach b generate flatten(menu#'popup') as popup;
d = foreach c generate flatten(popup#'menuitem') as menu;
e = foreach d generate flatten(menu#'value') as val;
DUMP e;

file3.json
{ "menu" : {
    "id" : "file",
    "value" : "File",
    "popup": {
      "menuitem" : [
        {"value" : "New", "onclick": "CreateNewDoc()"},
        {"value" : "Open", "onclick": "OpenDoc()"},
        {"value" : "Close", "onclick": "CloseDoc()"}
      ]
    }
 }}

実行時に次の例外が発生します。

org.apache.pig.backend.executionengine.ExecException: ERROR 6018: Error while reading input - Could not json-decode string: { "menu" : {
    at org.apache.pig.piggybank.storage.JsonLoader.parseStringToTuple(JsonLoader.java:127)

豚のログ ファイル:

Pig Stack Trace
---------------
ERROR 1066: Unable to open iterator for alias e

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias e
        at org.apache.pig.PigServer.openIterator(PigServer.java:901)
        at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:655)
        at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:303)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:188)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:164)
        at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84)
        at org.apache.pig.Main.run(Main.java:561)
        at org.apache.pig.Main.main(Main.java:111)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
Caused by: java.io.IOException: Job terminated with anomalous status FAILED
        at org.apache.pig.PigServer.openIterator(PigServer.java:893)
        ... 12 more
================================================================================   

間違っている場合は修正してください。ありがとう

4

1 に答える 1

3

Twitter の Elephant Bird: https://github.com/kevinweil/elephant-birdを使用して、ネストされた json の読み込みを処理できます。

a = LOAD 'file3.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad')

これにより、JSON がマップhttp://pig.apache.org/docs/r0.11.1/basic.html#map-schema に解析されます。JSONArray はマップの DataBag に解析されます。

于 2013-05-11T20:43:27.793 に答える