4

私はHiveとElasticMapreduceにかなり慣れておらず、現在特定の問題に固執しています。数十億行の JSON オブジェクトを含むテーブルで Hive ステートメントを実行すると、それらの行の 1 つだけが無効または不正な形式の JSON であるとすぐに、MapReduce ジョブがクラッシュします。

例外:

java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable {"ip":"39488130","cdate":"2012-08-09","cdate_ts":"2012-08-09 17:06:41","country":"SA","city":"Riyadh","mid":"6666276582211270592","osversion":"5.1.
1
at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:161)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable {"ip":"39488130","cdate":"2012-08-09","cdate_ts":"2012-08-09 17:06:41","country":"SA","city":"Riyadh","mid":"6666276582211270592","osversion":"5.1.1
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:524)
at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:143)
... 8 more
Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated string near
at com.google.gson.Streams.parse(Streams.java:51)
at com.google.gson.JsonParser.parse(JsonParser.java:83)
at com.google.gson.JsonParser.parse(JsonParser.java:58)
at com.google.gson.JsonParser.parse(JsonParser.java:44)
at com.amazon.elasticmapreduce.JsonSerde.deserialize(Unknown Source)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:510)
... 9 more
Caused by: com.google.gson.stream.MalformedJsonException: Unterminated string near
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1110)
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:967)
at com.google.gson.stream.JsonReader.nextValue(JsonReader.java:802)
at com.google.gson.stream.JsonReader.objectValue(JsonReader.java:782)
at com.google.gson.stream.JsonReader.quickPeek(JsonReader.java:377)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:340)
at com.google.gson.Streams.parseRecursive(Streams.java:60)
at com.google.gson.Streams.parseRecursive(Streams.java:83)
at com.google.gson.Streams.parse(Streams.java:40)
... 14 more

次のようにテーブルを作成します。

CREATE EXTERNAL TABLE IF NOT EXISTS table1 (
column1 string,
column2 string
)
PARTITIONED BY (year string, month string)
ROW FORMAT SERDE 'com.amazon.elasticmapreduce.JsonSerde'
WITH SERDEPROPERTIES ('paths'='c1, c2')
LOCATION 's3://mybucket/table1';

クラッシュを防ぐにはどうすればよいですか? 不正な形式の JSON オブジェクト/文字列を無視しても問題ありません。

事前にご協力いただきありがとうございます。ベスト、サーシャ

4

3 に答える 3

4

行フォーマットで使用されるクラスを変更し、「不正な形式」プロパティを追加することで、テーブルの作成を不正な形式の JSON で機能させることができます。

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("ignore.malformed.json" = "true")
LOCATION ...

「hive-site.xml」の「hive.aux.jars.path」プロパティを使用するか、「ADD JAR」Hive 命令を使用して JAR を含めます。JARはここで見つけるか、このソースからコンパイルできます。

于 2015-09-26T19:24:50.233 に答える
0

Apache の JsonSerDe は、不正な形式の JSON 文字列を無視しているようです... http://code.google.com/p/hive-json-serde/

于 2013-01-03T14:28:09.227 に答える
-2

基本的に、JSON無効な文字列が原因で上記のエラーが発生しています。この問題を解決してみてください。

それ以外の場合は、アプリのクラッシュを回避するために、try catch ブロックでその例外をキャッチし、さらに先に進みます。アプリがクラッシュしないようにします。

于 2013-01-03T13:02:17.770 に答える