いくつかのJSONデータ(ネストされた)からHiveテーブルを作成し、それに対してクエリを実行したいですか?これも可能ですか?
JSONファイルをS3にアップロードしてEMRインスタンスを起動するところまで到達しましたが、JSONファイルをHiveテーブルにするためにハイブコンソールに何を入力すればよいかわかりません。
誰かが私を始めるためのいくつかのサンプルコマンドを持っていますか、私はグーグルで役立つものを見つけることができません...
いくつかのJSONデータ(ネストされた)からHiveテーブルを作成し、それに対してクエリを実行したいですか?これも可能ですか?
JSONファイルをS3にアップロードしてEMRインスタンスを起動するところまで到達しましたが、JSONファイルをHiveテーブルにするためにハイブコンソールに何を入力すればよいかわかりません。
誰かが私を始めるためのいくつかのサンプルコマンドを持っていますか、私はグーグルで役立つものを見つけることができません...
実際には、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、特にネストされたオブジェクトを扱うさまざまな不可解な問題に遭遇しました)。
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/' ;
私は同じ問題を解決する必要がありましたが、JSONSerDesにまだリンクされているものはどれも十分に良いようには見えませんでした。アマゾンは良いかもしれませんが、どこにもそのソースを見つけることができません(誰かがリンクを持っていますか?)。
JsonSerDeに組み込まれているHCatalogは、実際には他の場所でHCatalogを使用していませんが、機能しています。
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'
...
;
私はここに詳細を投稿しました
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 }
.jsonファイルが大きい場合、スキーマを手動で作成するのは面倒な場合があります。その場合は、この便利なツールを使用して自動的に生成できます。
JSON処理機能がHiveですぐに利用できるようになりました。
Hive4.0.0以降
CREATE TABLE ... STORED AS JSONFILE
各JSONオブジェクトは、1行に収まるようにフラット化する必要があります(改行文字はサポートされていません)。これらのオブジェクトは、正式なJSON配列の一部ではありません。
{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}
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 /