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

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

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

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


person nickponline    schedule 13.07.2012    source источник
comment
Что вы пробовали?   -  person    schedule 14.07.2012
comment
Я пробовал LOAD DATA LOCAL INPATH 's3://my.bucket/data.json' OVERWRITE INTO TABLE Awards;, но это тоже не сработало.   -  person nickponline    schedule 14.07.2012


Ответы (7)


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

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

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

К сожалению, предоставленный serde JSON не очень хорошо обрабатывает вложенный 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/' ;
person seedhead    schedule 16.07.2012
comment
Спасибо, seedhead за решение, так как я тоже искал то же самое, и, прочитав ваше решение, я добился того, что хотел сделать. Спасибо ... Я застрял на еще одном вопросе, связанном с ульем. Вы можете мне помочь? http://stackoverflow.com/questions/11572800/what-will-be-the-rank-udf-for-this-scenario - person arsenal; 20.07.2012
comment
hive-json-serde.googlecode.com/files/ hive-json-serde-0.2.jar также работает и повышает производительность. - person elprup; 13.09.2012
comment
что значит не очень хорошо обрабатывает вложенный JSON? Можем ли мы вообще запросить вложенный json? - person spazm; 18.09.2014

На самом деле нет необходимости использовать 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';

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

person Mike Repass    schedule 13.11.2012
comment
jsonserde сбивает с толку, так много версий, так много статей, когда существует более простой способ без использования каких-либо внешних jar-файлов. Боковой просмотр с json_tuple самый простой и легкий. Спасибо - person spats; 07.06.2014

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

Встроенный в JsonSerDe HCatalog работает для меня, хотя на самом деле я нигде больше не использую HCatalog.

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

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

$ 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/

person otto    schedule 13.01.2014
comment
--auxpath, похоже, недоступен в версии Hive Amazon EMR, но команда ADD JAR служит той же цели. - person wingedsubmariner; 20.03.2015

У 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 }
person Heapify    schedule 17.05.2017

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

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

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

person Rok Kralj    schedule 09.01.2014

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

Hive 4.0.0 и новее

CREATE TABLE ... STORED AS JSONFILE


Чтобы создать таблицу Hive из файла JSON, вам нужно написать Оператор CREATE TABLE на основе стандартов HiveQL DDL специально для вашей структуры JSON.

Это может быть очень сложно, если вы используете вложенный файл JSON, поэтому я рекомендую вам использовать этот быстрый и простой генератор: https://hivetablegenerator.com/

Использование HiveQL для анализа файлов JSON требует правильной работы org.openx.data.jsonserde.JsonSerDe или org.apache.hive.hcatalog.data.JsonSerDe.

org.apache.hive.hcatalog.data.JsonSerDe
Это значение по умолчанию JSON SerDe от Apache. Обычно это используется для обработки данных JSON, таких как события. Эти события представлены в виде блоков текста в кодировке JSON, разделенных новой строкой. Hive JSON SerDe не допускает дублирования ключей в именах ключей карты или структуры.

org.openx.data.jsonserde.JsonSerDe
OpenX JSON SerDe похож на собственный Apache; однако он предлагает несколько дополнительных свойств, таких как ignore.malformed.json, case.insensitive и многие другие. На мой взгляд, это обычно лучше работает с вложенными файлами JSON.

Взяв этот пример сложного файла JSON:

{
  "schemaVersion": "1.0",
  "id": "07c1687a0fd34ebf8a42e8a8627321dc",
  "accountId": "123456677",
  "partition": "aws",
  "region": "us-west-2",
  "severity": {
      "score": "0",
      "description": "Informational"
  },
  "createdAt": "2021-02-27T18:57:07Z",
  "resourcesAffected": {
      "s3Bucket": {
          "arn": "arn:aws:s3:::bucket-sample",
          "name": "bucket-sample",
          "createdAt": "2020-08-09T07:24:55Z",
          "owner": {
              "displayName": "account-name",
              "id": "919a30c2f56c0b220c32e9234jnkj435n6jk4nk"
          },
          "tags": [],
          "defaultServerSideEncryption": {
              "encryptionType": "AES256"
          },
          "publicAccess": {
              "permissionConfiguration": {
                  "bucketLevelPermissions": {
                      "accessControlList": {
                          "allowsPublicReadAccess": false,
                          "allowsPublicWriteAccess": false
                      },
                      "bucketPolicy": {
                          "allowsPublicReadAccess": true,
                          "allowsPublicWriteAccess": false
                      },
                      "blockPublicAccess": {
                          "ignorePublicAcls": false,
                          "restrictPublicBuckets": false,
                          "blockPublicAcls": false,
                          "blockPublicPolicy": false
                      }
                  },
                  "accountLevelPermissions": {
                      "blockPublicAccess": {
                          "ignorePublicAcls": false,
                          "restrictPublicBuckets": false,
                          "blockPublicAcls": false,
                          "blockPublicPolicy": false
                      }
                  }
              },
              "effectivePermission": "PUBLIC"
          }
      },
      "s3Object": {
          "bucketArn": "arn:aws:s3:::bucket-sample",
          "key": "2021/01/17191133/Camping-Checklist-Google-Docs.pdf",
          "path": "bucket-sample/2021/01/17191133/Camping-Checklist-Google-Docs.pdf",
          "extension": "pdf",
          "lastModified": "2021-01-17T22:11:34Z",
          "eTag": "e8d990704042d2e1b7bb504fb5868095",
          "versionId": "isqHLkSsQUMbbULNT2nMDneMG0zqitbD",
          "serverSideEncryption": {
              "encryptionType": "AES256"
          },
          "size": "150532",
          "storageClass": "STANDARD",
          "tags": [],
          "publicAccess": true
      }
  },
  "category": "CLASSIFICATION",
  "classificationDetails": {
      "jobArn": "arn:aws:macie2:us-west-2:123412341341:classification-job/d6cf41ccc7ea8daf3bd53ddcb86a2da5",
      "result": {
          "status": {
              "code": "COMPLETE"
          },
          "sizeClassified": "150532",
          "mimeType": "application/pdf",
          "sensitiveData": []
      },
      "detailedResultsLocation": "s3://bucket-macie/AWSLogs/123412341341/Macie/us-west-2/d6cf41ccc7ea8daf3bd53ddcb86a2da5/123412341341/50de3137-9806-3e43-9b6e-a6158fdb0e3b.jsonl.gz",
      "jobId": "d6cf41ccc7ea8daf3bd53ddcb86a2da5"
  }
}

Потребуется следующий оператор создания таблицы:

CREATE EXTERNAL TABLE IF NOT EXISTS `macie`.`macie_bucket` (
    `schemaVersion` STRING,
    `id` STRING,
    `accountId` STRING,
    `partition` STRING,
    `region` STRING,
    `severity` STRUCT<
    `score`:STRING,
`description`:STRING>,
    `createdAt` STRING,
    `resourcesAffected` STRUCT<
    `s3Bucket`:STRUCT<
    `arn`:STRING,
`name`:STRING,
`createdAt`:STRING,
`owner`:STRUCT<
    `displayName`:STRING,
`id`:STRING>,
`defaultServerSideEncryption`:STRUCT<
    `encryptionType`:STRING>,
`publicAccess`:STRUCT<
    `permissionConfiguration`:STRUCT<
    `bucketLevelPermissions`:STRUCT<
    `accessControlList`:STRUCT<
    `allowsPublicReadAccess`:BOOLEAN,
`allowsPublicWriteAccess`:BOOLEAN>,
`bucketPolicy`:STRUCT<
    `allowsPublicReadAccess`:BOOLEAN,
`allowsPublicWriteAccess`:BOOLEAN>,
`blockPublicAccess`:STRUCT<
    `ignorePublicAcls`:BOOLEAN,
`restrictPublicBuckets`:BOOLEAN,
`blockPublicAcls`:BOOLEAN,
`blockPublicPolicy`:BOOLEAN>>,
`accountLevelPermissions`:STRUCT<
    `blockPublicAccess`:STRUCT<
    `ignorePublicAcls`:BOOLEAN,
`restrictPublicBuckets`:BOOLEAN,
`blockPublicAcls`:BOOLEAN,
`blockPublicPolicy`:BOOLEAN>>>,
`effectivePermission`:STRING>>,
`s3Object`:STRUCT<
    `bucketArn`:STRING,
`key`:STRING,
`path`:STRING,
`extension`:STRING,
`lastModified`:STRING,
`eTag`:STRING,
`versionId`:STRING,
`serverSideEncryption`:STRUCT<
    `encryptionType`:STRING>,
`size`:STRING,
`storageClass`:STRING,
`publicAccess`:BOOLEAN>>,
    `category` STRING,
    `classificationDetails` STRUCT<
    `jobArn`:STRING,
`result`:STRUCT<
    `status`:STRUCT<
    `code`:STRING>,
`sizeClassified`:STRING,
`mimeType`:STRING>,
`detailedResultsLocation`:STRING,
`jobId`:STRING>)
ROW FORMAT SERDE 
     'org.openx.data.jsonserde.JsonSerDe'
LOCATION
     's3://awsexamplebucket1-logs/AWSLogs/'

Если вам нужна дополнительная информация от Amazon о том, как создать таблицу из вложенных файлов JSON для AWS Athena, перейдите по этой ссылке: https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/

person brngyn    schedule 23.03.2021