2017-02-11 8 views
1

Webサービスの応答としてjsonデータを取り出す外部テーブルをHiveに作成しようとしています。エラーJSONデータを保存するためにハイブに外部テーブルを作成する

JSONファイルのデータは、私は、外部表のスキーマを作成したかに基づいて以下の通りである:

{ 
    "location": { 
     "name": "Paris", 
     "region": "Ile-de-France", 
     "country": "France", 
     "lat": 48.87, 
     "lon": 2.33, 
     "tz_id": "Europe/Paris", 
     "localtime_epoch": 1486792043, 
     "localtime": "2017-02-11 5:47" 
    }, 
    "current": { 
     "last_updated_epoch": 1486792043, 
     "last_updated": "2017-02-11 05:47", 
     "temp_c": 0.0, 
     "temp_f": 32.0, 
     "is_day": 0, 
     "condition": { 
      "text": "Mist", 
      "icon": "//cdn.apixu.com/weather/64x64/night/143.png", 
      "code": 1030 
     }, 
     "wind_mph": 8.1, 
     "wind_kph": 13.0, 
     "wind_degree": 330, 
     "wind_dir": "NNW", 
     "pressure_mb": 1019.0, 
     "pressure_in": 30.6, 
     "precip_mm": 0.0, 
     "precip_in": 0.0, 
     "humidity": 74, 
     "cloud": 0, 
     "feelslike_c": -4.0, 
     "feelslike_f": 24.8 
    } 
} 

作成し、外部表のコマンドを以下に示し:

CREATE EXTERNAL TABLE weatherdata (
    location STRUCT< 
     name:STRING, 
     region:STRING, 
     country:STRING, 
     lat:FLOAT, 
     lon:FLOAT, 
     tz_id:STRING, 
     localtime:STRING>, 
    current STRUCT< 
     last_updated_epoch:BIGINT, 
     last_updated:STRING, 
     temp_c:FLOAT, 
     temp_f:FLOAT, 
     is_day:INT, 
     condition:STRUCT<text:STRING, icon:STRING, code:INT>, 
     wind_mph:FLOAT, wind_kph:FLOAT, 
     wind_degree:INT, 
     wind_dir:STRING, 
     pressure_mb:FLOAT, 
     pressure_in:FLOAT, 
     precip_mm:FLOAT, 
     precip_in:FLOAT, 
     humidity:INT, 
     cloud:INT, 
     feelslike_c:FLOAT, 
     feelslike_f:FLOAT> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'; 

私は下のエラーを取得します

FAILED: ParseException line 9:3 cannot recognize input near 'current' 'STRUCT' '<' in column specification 

フィールド 'current'を 'curr'としてチェックするだけでこの外部テーブルを作成しようとしましたテーブルが正常に作成されました。明らかなように、上記の 'json'データをこの表にロードすると、 'location'データのみが正常にロードされ、 'current'データはnullと表示されます。 'current'はハイブのキーワードですか?どうした ? この問題の解決にお役立てください。

+0

をバック使用 :STRUCT'を、なぜ何の ' - :そこで以下のようにDDLを使うのか? –

+1

@ cricket_007 ':'は内部構造変数にのみ使用されます。 –

答えて

2

はいハイブの「CURRENT」はReserved Keywordです。バック・ティック( `)文字を使用してそれらを囲むことで、それらを識別子として使用できます。列名の引用符で囲まれた識別子についてはdocumentationを参照してください。ここで

create文はselectにも

....  
     tz_id:STRING, 
      localtime:STRING>, 
     `current` STRUCT< 
      last_updated_epoch:BIGINT, 
      last_updated:STRING, 
      temp_c:FLOAT, 
.... 

次のようになります。

select `current` from weatherdata; 
0

現在は予約キーワードです。 `location`または` current`に `:あなたは`条件がないダニ

CREATE EXTERNAL TABLE weatherdata (
    `location` STRUCT< 
     name:STRING, 
     region:STRING, 
     country:STRING, 
     lat:FLOAT, 
     lon:FLOAT, 
     tz_id:STRING, 
     localtime:STRING>, 
    `current` STRUCT< 
     last_updated_epoch:BIGINT, 
     last_updated:STRING, 
     temp_c:FLOAT, 
     temp_f:FLOAT, 
     is_day:INT, 
     condition:STRUCT<text:STRING, icon:STRING, code:INT>, 
     wind_mph:FLOAT, wind_kph:FLOAT, 
     wind_degree:INT, 
     wind_dir:STRING, 
     pressure_mb:FLOAT, 
     pressure_in:FLOAT, 
     precip_mm:FLOAT, 
     precip_in:FLOAT, 
     humidity:INT, 
     cloud:INT, 
     feelslike_c:FLOAT, 
     feelslike_f:FLOAT> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'; 
関連する問題