我有一个类似下面的JSON文件,我希望在解析格式的HIVE表中加载,我可以选择哪些选项。
如果是AVRO那么我可以直接使用AvroSerDe。但在这种情况下,源文件是JSON。
{
"subscriberId":"vfd1234-07e1-4054-9b64-83a5a20744db",
"cartId":"1234edswe-6a9c-493c-bcd0-7fb71995beef",
"cartStatus":"default",
"salesChannel":"XYZ",
"accountId":"12345",
"channelNumber":"12",
"timestamp":"Dec 12, 2013 8:30:00 AM",
"promotions":[
{
"promotionId":"NEWID1234",
"promotionContent":{
"has_termsandconditions":[
"TC_NFLMAXDEFAULT16R103578"
],
"sequenceNumber":"305",
"quantity":"1",
"promotionLevel":"basic",
"promotionDuration":"1",
"endDate":"1283142400000",
"description":"Regular Season One Payment",
"active":"true",
"disableInOfferPanel":"true",
"displayInCart":"true",
"type":"promotion",
"frequencyOfCharge":"weekly",
"promotionId":"NEWID1234",
"promotionIndicator":"No",
"shoppingCartTitle":"Regular Season One Payment",
"discountedPrice":"0",
"preselectedInOfferPanel":"false",
"price":"9.99",
"name":"Regular Season One Payment",
"have":[
"CatNFLSundayMax"
],
"ID":"NEWID1234",
"startDate":"1451365600000",
"displayInOfferPanel":"true"
}
}
]
}
我确实尝试使用org.openx.data.jsonserde.JsonSerDe
创建一个表格,但它没有向我显示数据。
CREATE EXTERNAL TABLE test1
(
SUBSCRIBER_ID string,
CART_ID string,
CART_STAT_NAME string,
SLS_CHAN_NAME string,
ACCOUNT_ID string,
CHAN_NBR string,
TX_TMSTMP string,
PROMOTION ARRAY<STRING>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '<HDFS location where the json file is place in single line>';
答案 0 :(得分:1)
不确定您使用的JsonSerDe
。在这里,您可以使用此JsonSerDe
。Hive-JSON-Serde
hive> add jar /User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar;
Added [/User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar] to class path
Added resources: [/User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar]
hive> use default;
OK
Time taken: 0.021 seconds
hive> CREATE EXTERNAL TABLE IF NOT EXISTS json_poc (
> alertHistoryId bigint, entityId bigint, deviceId string, alertTypeId int, AlertStartDate string
> )
> ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
> LOCATION '/User/User1/sandeep_poc/hive_json';
OK
Time taken: 0.077 seconds
hive> select * from json_poc;
OK
123456 123 123 1 jan 04, 2017 2:46:48 PM
Time taken: 0.052 seconds, Fetched: 1 row(s)
如何制作jar。 应该在你的PC上安装Maven然后运行这样的命令。
C:\Users\User1\Downloads\Hive-JSON-Serde-develop\Hive-JSON-Serde-develop>mvn -Phdp23 clean package.
-Phdp23 is hdp2.3 it should be replaced with your hadoop version.
或者,如果您想使用内置的JsonSerde
get_json_object json_tuple
如果您正在寻找一个如何使用的示例,请参阅此博客 Hive-JSON-Serde example。
我也建议您验证您的JSON文件。JSON Validator
答案 1 :(得分:1)
当您使用hive 0.12及更高版本时,请使用hive-hcatalog-core
,
注意:对于0.12之前的Hive版本,Amazon在s3提供了一个JSON SerDe://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar。
你应该首先添加jar hive-hcatalog-core
,
ADD JAR /path/to/jar/;
您可以从mvn repository下载或手动查找。
然后hive表应该看起来像
CREATE EXTERNAL TABLE test1
(
SUBSCRIBER_ID string,
CART_ID string,
CART_STAT_NAME string,
SLS_CHAN_NAME string,
ACCOUNT_ID string,
CHAN_NBR string,
TX_TMSTMP string,
PROMOTION ARRAY<STRING>
)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION '<HDFS location where the json file is place in single line>';
答案 2 :(得分:0)
在配置单元表中加载JSON文件数据的步骤
1]在配置单元中创建表格
hive>创建表JsonTableExample(数据字符串);
2]将JSON文件加载到配置单元表中
hive>将路径'/home/cloudera/testjson.json'中的数据加载到表JsonTableExample中;
3]如果应用普通的从JsonTableExample中选择*; ,我们将获取所有数据。这不是有效的解决方案,因为我们必须执行步骤4。
4]使用 get_json_object()函数
选择数据hive>选择get_json_object(data,'$。id')作为ID, get_json_object(data,'$。name')作为JsonTableExample中的名称;
答案 3 :(得分:0)
对于许多版本的 Hive,启用 JSON 处理的最佳方法可能是使用前面提到的 org.apache.hive.hcatalog.data.JsonSerDe
。这是开箱即用的功能。但是,对于某些版本的 CDH6 和 HDP3,有一个新功能,其中 JSON 是一等公民。这存在于 Apache Hive 4.0 及更高版本中。
CREATE TABLE ... STORED AS JSONFILE;
请注意,每个 JSON 对象必须独占一行(不能换行)。
{"name"="john","age"=30}
{"name"="sue","age"=32}
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL