我想用一些 JSON 数据(嵌套)创建一个 Hive 表并对其运行查询?这甚至可能吗?
我已经将 JSON 文件上传到 S3 并启动了 EMR 实例,但我不知道在 hive 控制台中输入什么才能让 JSON 文件成为 Hive 表?
有没有人有一些示例命令让我开始,我找不到任何对谷歌有用的东西......
我想用一些 JSON 数据(嵌套)创建一个 Hive 表并对其运行查询?这甚至可能吗?
我已经将 JSON 文件上传到 S3 并启动了 EMR 实例,但我不知道在 hive 控制台中输入什么才能让 JSON 文件成为 Hive 表?
有没有人有一些示例命令让我开始,我找不到任何对谷歌有用的东西......
实际上没有必要使用 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 的各种神秘问题,尤其是嵌套对象)。
您需要使用 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/' ;
我只需要解决同样的问题,到目前为止,还没有一个与 JSON SerDes 相关联的方法看起来足够好。亚马逊的可能很好,但我在任何地方都找不到它的来源(有人有链接吗?)。
HCatalog 内置的 JsonSerDe 对我有用,即使我实际上并没有在其他任何地方使用 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 中的 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 }
如果您的 .json 文件很大,手动编写架构可能会很乏味。如果是这样,您可以使用这个方便的工具自动生成它。
JSON 处理功能现在在 Hive 中可用,开箱即用。
Hive 4.0.0 及更高版本
CREATE TABLE ... STORED AS JSONFILE
每个 JSON 对象都必须展平以适合一行(不支持换行符)。这些对象不是正式 JSON 数组的一部分。
{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}
要从 JSON 文件创建 Hive 表,您需要根据专门针对您的 JSON 结构的HiveQL DDL 标准编写 CREATE TABLE 语句。
如果您使用的是嵌套的 JSON 文件,这可能会非常复杂,因此我建议您使用这个快速简便的生成器:https ://hivetablegenerator.com/
使用 HiveQL 分析 JSON 文件需要org.openx.data.jsonserde.JsonSerDe
或org.apache.hive.hcatalog.data.JsonSerDe
才能正常工作。
org.apache.hive.hcatalog.data.JsonSerDe
这是来自 Apache 的默认 JSON SerDe。这通常用于处理事件等 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 的有关如何使用 AWS Athena 的嵌套 JSON 文件创建表的更多信息,请查看此链接:https ://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena -from-nested-json-and-mappings-using-jsonserde/