我正在尝试使用Json serde将具有嵌套结构的大量json数据加载到hive。某些字段名称以嵌套结构中的$
开头。我正在使用SerDeproperties
来映射配置文件的名称,但是当我查询表时,在以$
开头的字段中获取null,尝试使用不同的语法,但没有运气。
示例JSON:
{
"_id" : "319FFE15FF90",
"SomeThing" :
{
"$SomeField" : 22,
"AnotherField" : 2112,
"YetAnotherField": 1
}
. . . etc . . . .
使用如下架构:
create table testSample
(
`_id` string,
something struct
<
$somefield:int,
anotherfield:bigint,
yetanotherfield:int
>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties
(
"mapping.somefield" = "$somefield"
);
此架构构建正常,但是,上表中的某些字段(以$
开头)始终返回null(所有其他值都存在且正确)。
我们一直在尝试很多语法组合,但无济于事。
是否有人知道在其名称中带有$
的嵌套字段的技巧?
答案 0 :(得分:2)
你几乎做对了。尝试像这样创建表。 您所犯的错误是,当在serde属性(mapping.somefield =“$ somefield”)中进行映射时,您说“在查找名为'somefield'的hive列时,请查找json字段'$ somefield',但是在蜂巢中你用美元符号定义了列,如果不是完全非法的话,那肯定不是蜂巢中的最佳做法。
create table testSample
(
`_id` string,
something struct
<
somefield:int,
anotherfield:bigint,
yetanotherfield:int
>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties
(
"mapping.somefield" = "$somefield"
);
我用一些测试数据测试了它:
{ "_id" : "123", "something": { "$somefield": 12, "anotherfield":13,"yetanotherfield":100}}
hive> select something.somefield from testSample;
OK
12
答案 1 :(得分:0)
我突然开始看到这个问题,但对于普通的列名也是如此(没有像$这样的特殊字符)
我从另一个内部表(Table2)填充外部表(Temp),并希望以JSON格式输出Temp表。我想在输出JSON文件中使用camel case中的列名,因此我也使用Temp表中的Serdepoperties来指定正确的名称。但是,我看到当我从Temp表中执行Select *时,它为名称已在映射中使用的列提供NULL值。
我正在运行Hive 0.13。以下是命令:
创建表命令:
CREATE EXTERNAL TABLE Temp (
data STRUCT<
customerId:BIGINT, region:STRING, marketplaceId:INT, asin:ARRAY<STRING>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'mapping.customerid' = 'customerId',
'mapping.marketplaceid' = 'marketplaceId'
)
LOCATION '/output';
INSERT INTO TABLE Temp
SELECT
named_struct ('customerId',customerId, 'region', region, 'marketplaceId', marketplaceId, 'asin', asin)
FROM Table2;
从Temp:
中选择*{"customerid":null,"region":"EU","marketplaceid":null,"asin":["B000FC1PZC"]}
{"customerid":null,"region":"EU","marketplaceid":null,"asin":["B000FC1C9G"]}
了解&#34; customerid&#34;和&#34; marketplaceid&#34;是空的。生成的JSON文件是:
{"data":{"region":"EU","asin":["B000FC1PZC"]}}
{"data":{"region":"EU","asin":["B000FC1C9G"]}}
现在,如果我删除with serdeproperties,表格将开始获取所有值:
{"customerid":1,"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"]}
{"customerid":2,"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"]}
然后生成的JSON文件是:
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"],"customerid":1}}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"],"customerid":2}}