【问题标题】:How do you make a HIVE table out of JSON data?如何使用 JSON 数据制作 HIVE 表?
【发布时间】:2012-07-13 19:42:48
【问题描述】:

我想用一些 JSON 数据(嵌套)创建一个 Hive 表并对其运行查询?这甚至可能吗?

我已经将 JSON 文件上传到 S3 并启动了一个 EMR 实例,但我不知道在 hive 控制台中输入什么才能让 JSON 文件成为 Hive 表?

有没有人有一些示例命令让我开始,我找不到任何对 Google 有用的东西...

【问题讨论】:

  • 我试过LOAD DATA LOCAL INPATH 's3://my.bucket/data.json' OVERWRITE INTO TABLE Awards;,但也没用。

标签: json hadoop hive amazon-emr emr


【解决方案1】:

要从 JSON 文件中创建 Hive 表,您需要专门为您的 JSON 结构编写 CREATE TABLE statement based on HiveQL DDL standards

如果您使用嵌套的 JSON 文件可能会非常复杂,因此我建议您使用这个快速简单的生成器:https://hivetablegenerator.com/

使用 HiveQL 分析 JSON 文件需要 org.openx.data.jsonserde.JsonSerDeorg.apache.hive.hcatalog.data.JsonSerDe 才能正常工作。

org.apache.hive.hcatalog.data.JsonSerDe
这是默认的JSON SerDe from 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/'

如果您需要亚马逊提供有关如何为 AWS Athena 使用嵌套 JSON 文件创建表的更多信息,请查看此链接:https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/

【讨论】:

    【解决方案2】:

    JSON 处理功能现在可在 Hive 中开箱即用。

    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}
    

    【讨论】:

      【解决方案3】:

      hcatalog-core 中的 Hive 0.12 及更高版本具有 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 }
      

      【讨论】:

        【解决方案4】:

        从 .json 文件生成 SerDe 架构

        如果您的 .json 文件很大,手动编写架构可能会很乏味。如果是这样,您可以使用这个方便的工具自动生成它。

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

        【讨论】:

          【解决方案5】:

          实际上没有必要使用 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 的各种神秘问题,尤其是嵌套对象)。

          【讨论】:

          • jsonserde 令人困惑,这么多版本这么多文章,当更简单的方法存在而不使用任何外部 jar 时。带有 json_tuple 的 LATERAL VIEW 是最简单和最简单的。谢谢
          【解决方案6】:

          我只需要解决同样的问题,目前还没有一个链接到 JSON SerDes 的工具似乎足够好。亚马逊的可能不错,但我在任何地方都找不到它的来源(有人有链接吗?)。

          内置 JsonSerDe 的 HCatalog 对我有用,尽管我实际上并没有在其他任何地方使用 HCatalog。

          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 表:

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

          【讨论】:

          • --auxpath 似乎不适用于 Amazon EMR 的 Hive 版本,但 ADD JAR 命令具有相同的用途。
          【解决方案7】:

          您需要使用 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/' ;
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-08
          相关资源
          最近更新 更多