Подтвердить что ты не робот

Как вы делаете таблицу HIVE из данных JSON?

Я хочу создать таблицу Hive из некоторых данных JSON (вложенных) и запустить на нем запросы? Возможно ли это?

Я дошел до загрузки JSON файла на S3 и запуска экземпляра EMR, но я не знаю, что ввести в консоль куста, чтобы получить JSON файл в таблице Hive?

Есть ли у кого-нибудь пример команды, чтобы начать меня, я не могу найти ничего полезного с Google...

4b9b3361

Ответ 1

Вам нужно будет использовать JSON serde, чтобы Hive мог сопоставить JSON со столбцами в вашей таблице.

Действительно хороший пример, показывающий, как здесь:

http://aws.amazon.com/articles/2855

К сожалению, поставляемый JSON serde не очень хорошо обрабатывает вложенные JSON, поэтому вам может понадобиться сгладить ваш JSON, чтобы использовать его.

Вот пример правильного синтаксиса из статьи:

create external table impressions (
    requestBeginTime string, requestEndTime string, hostname string
  )
  partitioned by (
    dt string
  )
  row format 
    serde 'com.amazon.elasticmapreduce.JsonSerde'
    with serdeproperties ( 
      'paths'='requestBeginTime, requestEndTime, hostname'
    )
  location 's3://my.bucket/' ;

Ответ 2

На самом деле не нужно использовать JSON SerDe. Здесь есть отличная запись в блоге (я никак не связан с автором):

http://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/

Что описывает стратегию с помощью встроенной функции json_tuple для синтаксического анализа json во время запроса (НЕ во время определения таблицы):

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_tuple

Итак, ваша схема таблиц просто загружает каждую строку в виде одного столбца "строка", а затем извлекает соответствующие json-поля по мере необходимости на основе каждого запроса. например этот запрос из этого сообщения в блоге:

SELECT b.blogID, c.email FROM comments a LATERAL VIEW json_tuple(a.value, 'blogID', 'contact') b 
AS blogID, contact  LATERAL VIEW json_tuple(b.contact, 'email', 'website') c 
AS email, website WHERE b.blogID='64FY4D0B28';

В моем скромном опыте это оказалось более надежным (я столкнулся с различными загадочными проблемами, относящимися к JSON serdes, особенно с вложенными объектами).

Ответ 3

Мне просто пришлось решить ту же проблему, и ни одна из них, пока еще не связанная с JSON SerDes, казалась достаточно хорошей. Amazon может быть хорошим, но я не могу найти источник для него где-нибудь (у кого есть ссылка?).

HCatalog, встроенный в JsonSerDe, работает для меня, даже если я вообще не использую HCкаталог.

https://github.com/apache/hcatalog/blob/branch-0.5/core/src/main/java/org/apache/hcatalog/data/JsonSerDe.java

Чтобы использовать HCatalog JsonSerDe, добавьте hcatalog-core.jar в Hive auxpath и создайте таблицу улья:

$ hive --auxpath /path/to/hcatalog-core.jar

hive (default)>
create table my_table(...)
ROW FORMAT SERDE
  'org.apache.hcatalog.data.JsonSerDe'
...
;

Я написал сообщение здесь с более подробной информацией

http://ottomata.org/tech/too-many-hive-json-serdes/

Ответ 4

Hive 0.12, а затем в hcatalog-core имеет JsonSerDe, который будет сериализовать и десериализовать данные JSON. Итак, все, что вам нужно сделать, это создать внешнюю таблицу, например, следующий пример:

CREATE EXTERNAL TABLE json_table (
    username string,
    tweet string,
    timestamp long)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION
 'hdfs://data/some-folder-in-hdfs'

Соответствующий файл данных json должен выглядеть следующим образом:

{"username":"miguno","tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","tweet":"Works as intended.  Terran is IMBA.","timestamp": 1366154481 }

Ответ 5

Создание схемы SerDe из файла .json

Если ваш .json файл большой, может быть очень сложно написать схему вручную. Если это так, вы можете использовать этот удобный инструмент для его автоматического создания.

https://github.com/strelec/hive-serde-schema-gen

Ответ 6

Возможности обработки JSON теперь доступны в Hive "из коробки".

Улей 4.0.0 и позже

CREATE TABLE ... STORED AS JSONFILE

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormatsStorageFormatsRowFormat,StorageFormat,andSerDe

Каждый объект JSON должен быть сведен, чтобы поместиться в одну строку (не поддерживает символы новой строки). Эти объекты не являются частью формального массива JSON.

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}