2017-02-11 2 views
1

Я пытаюсь создать внешнюю таблицу в улье, которая извлекает данные json в качестве ответа веб-службы.Ошибка создания внешней таблицы в улье для сохранения данных 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» as «curr», чтобы проверить и таблица была создана успешно. Очевидно, что при загрузке данных «json», приведенных выше, в эту таблицу были загружены только «данные местоположения», а «текущие» данные были нулевыми. Is 'current' ключевое слово в улье? В чем проблема ? Пожалуйста, помогите решить эту проблему.

+0

Вы 'Состояние: STRUCT', так почему нет': '' на location' или 'current'? –

+1

@ cricket_007 ':' используется только для внутренних структурных переменных. –

ответ

2

Да «ТЕКУЩИЙ» - это Reserved Keyword в улье. Вы можете использовать их как идентификаторы, окружив их символами back-tick (`). Обратитесь к этому documentation о указателях идентификаторов в именах столбцов.

Здесь create заявление будет

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

Также на select:

select `current` from weatherdata; 
0

Ток зарезервированное ключевое слово. Поэтому не использовать DDL, как показано ниже: - использовать назад Tick

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'; 
Смежные вопросы