編集: JSON 構造にマップするように HQL ステートメントを変更しました。しかし、エラーは続く
HIVE テーブルを作成し、JSONSerDe を使用してデータを取得する方法をいくつか試しました。しかし、ここに私が遭遇するエラーがあります:
hive> select * from jobs;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: j
ava.io.EOFException: No content to map to Object due to end of input
hive> select values from jobs;
Diagnostic Messages for this Task:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error
while processing writable
at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:159)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:417)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
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 :1408)
テーブル作成ステートメントは次のとおりです。
create external table jobs (
jobs STRUCT<
values : ARRAY<STRUCT<
id : STRING,
customerJobCode : STRING,
postingDate : STRING,
expirationDate : STRING,
company : STRUCT<
id : STRING,
name : STRING>,
position : STRUCT<
title : STRING,
jobFunctions : STRING,
industries : STRING,
jobType : STRING,
experienceLevel : STRING>,
skillsAndExperience : ARRAY<STRING>,
descriptionSnippet : ARRAY<STRING>,
salary : STRING,
jobPoster : STRUCT<
id : STRING,
firstName : STRING,
lastName : STRING,
headline : STRING>,
referralBonus : STRING,
locationDescription : STRING>>>
)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
LOCATION '/user/sunita/tables/jobs';
テーブルの説明に「値」(構造の配列)を追加しないようにしましたまた、入力ファイルとテーブル作成ステートメントに「値」を追加せずに試しました。このアプローチにはエラーはありませんが、予想されるように、テーブルに入るエントリは 1 つだけで、それ以外はすべて null になります。Hive は、この問題を引き起こす単一のレコードと見なします。
より少ないフィールドを選択するために入力を簡素化しようとしましたが、情報を取得するときに同じエラーが発生します。この点でどんな助けも本当に感謝しています。
また、メモ帳 ++ JSON プラグインを使用して、JSON 文字列が有効であることを確認しました。どんな助けでも本当に感謝しています。