39

いくつかのJSONデータ(ネストされた)からHiveテーブルを作成し、それに対してクエリを実行したいですか?これも可能ですか?

JSONファイルをS3にアップロードしてEMRインスタンスを起動するところまで到達しましたが、JSONファイルをHiveテーブルにするためにハイブコンソールに何を入力すればよいかわかりません。

誰かが私を始めるためのいくつかのサンプルコマンドを持っていますか、私はグーグルで役立つものを見つけることができません...

4

7 に答える 7

34

実際には、JSONSerDeを使用する必要はありません。ここに素晴らしいブログ投稿があります(私は著者とは一切関係がありません):

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、特にネストされたオブジェクトを扱うさまざまな不可解な問題に遭遇しました)。

于 2012-11-13T21:16:24.293 に答える
25

HiveがJSONをテーブルの列にマップするには、JSONセルデを使用する必要があります。

ここにどのようにあるかを示す本当に良い例:

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

残念ながら、提供されているJSON 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/' ;
于 2012-07-16T21:16:10.927 に答える
3

私は同じ問題を解決する必要がありましたが、JSONSerDesにまだリンクされているものはどれも十分に良いようには見えませんでした。アマゾンは良いかもしれませんが、どこにもそのソースを見つけることができません(誰かがリンクを持っていますか?)。

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/

于 2014-01-13T18:00:51.050 に答える
3

hcatalog-coreのHive0.12以降には、JSONデータをシリアル化および逆シリアル化するJsonSerDeがあります。したがって、必要なのは、次の例のような外部テーブルを作成することだけです。

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 }
于 2017-05-17T05:04:04.990 に答える
2

.jsonファイルからのSerDeスキーマの生成

.jsonファイルが大きい場合、スキーマを手動で作成するのは面倒な場合があります。その場合は、この便利なツールを使用して自動的に生成できます。

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

于 2014-01-09T17:38:03.873 に答える
1

JSON処理機能がHiveですぐに利用できるようになりました。

Hive4.0.0以降

CREATE TABLE ... STORED AS JSONFILE

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

各JSONオブジェクトは、1行に収まるようにフラット化する必要があります(改行文字はサポートされていません)。これらのオブジェクトは、正式なJSON配列の一部ではありません。

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}
于 2019-04-06T21:54:23.050 に答える
0

JSONファイルからHiveテーブルを作成するには、JSON構造専用のHiveQLDDL標準に基づいてCREATETABLEステートメントを作成する必要があります。

ネストされたJSONファイルを使用している場合は非常に複雑になる可能性があるため、次の迅速で簡単なジェネレーターを使用することをお勧めします:https ://hivetablegenerator.com/

HiveQLを使用してJSONファイルを分析するには、org.openx.data.jsonserde.JsonSerDeまたはorg.apache.hive.hcatalog.data.JsonSerDeが正しく機能する必要があります。

org.apache.hive.hcatalog.data.JsonSerDe
これは、ApacheのデフォルトのJSONSerDeです。これは通常、イベントなどのJSONデータを処理するために使用されます。これらのイベントは、新しい行で区切られたJSONエンコードされたテキストのブロックとして表されます。Hive JSON SerDeは、マップまたは構造体のキー名に重複するキーを許可しません。

org.openx.data.jsonserde.JsonSerDe
OpenXJSONSerDeはネイティブ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"
  }
}

次のcreatetableステートメントが必要になります。

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ファイルからテーブルを作成する方法に関するAmazonの詳細情報が必要な場合は、次のリンクを確認してください:https ://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena -from-nested-json-and-mappings-using-jsonserde /

于 2021-03-23T04:57:18.753 に答える