Json 配置单元服务器处理嵌套结构时出现问题
我正在尝试使用json serde将具有嵌套结构的大量json数据加载到配置单元中。在嵌套结构中,某些字段名以Json 配置单元服务器处理嵌套结构时出现问题,json,struct,hive,Json,Struct,Hive,我正在尝试使用json serde将具有嵌套结构的大量json数据加载到配置单元中。在嵌套结构中,某些字段名以$开头。我正在使用SerDeproperties映射配置单元文件名,但是当我查询表时,从$开始的字段中得到null,尝试使用不同的语法,但没有成功 示例JSON: { "_id" : "319FFE15FF90", "SomeThing" : { "$SomeField" : 22, "AnotherFie
$
开头。我正在使用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"
);
创建表testSample
(
`_id`string,
结构物
<
$somefield:int,
另一个字段:bigint,
yetanotherfield:int
>
)
行格式serde'org.openx.data.jsonserde.jsonserde'
具有serdeproperty
(
“mapping.somefield”=“$somefield”
);
此架构构建为OK,但是,上表中的somefield(以$
开头)始终返回null(所有其他值都存在且正确)
我们已经尝试了很多语法组合,但都没有用
有人知道在嵌套字段的名称中加一个前导的
$
的诀窍吗?你几乎猜对了。尝试这样创建表。
您犯的错误是,在serde属性(mapping.somefield=“$somefield”)中进行映射时,您说的是“在查找名为'somefield'的配置单元列时,查找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"
);
我突然也发现了这个问题,但是对于普通的列名(没有特殊字符,比如$) 我正在从另一个内部表(表2)填充外部表(Temp)并且希望以JSON格式输出临时表。我希望在输出JSON文件中使用驼峰大小写的列名,因此我还使用临时表中的serdeperties指定正确的名称。但是,我发现,当我从临时表中选择*时,它会为映射中使用名称的列提供空值 我正在运行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;
查看“customerid”和“marketplaceid”如何为空。生成的JSON文件为:
{"data":{"region":"EU","asin":["B000FC1PZC"]}}
{"data":{"region":"EU","asin":["B000FC1C9G"]}}
现在,如果删除with SERDEPROPERTY,表将开始获取所有值:
{"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}}
我可以建议您做以下几件事:1)在
创建表
命令中将$somefield:int
转换为“$somefield”:int
。2)尝试使用不同的JsonSerDe,例如,让我知道,如果这个助手中的任何一个不好,这是帖子中的一个打字错误($somefield:int),但实际上声明代码是好的。对于像{“\u fld1”这样的数据“:{fld1:“12345”},“fld2:“ABCD”}创建表时使用以下行格式SERDE'org.openx.data.jsonserde.jsonserde'和SERDEPROPERTIES(“mapping.dfld1”=“$fld1”),但是当我选择表字段dfld1时,它总是空的,我是否遗漏了什么。Thanksit使用您提供的表定义和数据对我来说很好,但我必须在backticks(`u fld1`)周围放置`u fld1`:hive>select*from temp;好的{“dfld1”:“12345”}ABCD是您正在使用的实际定义,还是只是简化了它?您使用的是什么版本的serde/hive/hadoop?这对我来说也很好:hive>select`_fld1`.dfld1 from temp;好的12345我对以$开头的字段名有问题,它总是返回null。我正在CDH5.5.0上使用Hive版本1.1.0和Hadoop 2.6.0。我想我正在使用最新的hive json serde,因为我最近下载了它。非常感谢您的帮助&time.ok,为了确保它是一个版本特定的问题,您可以获取以下文件:,它包含我使用的create.sql和data.txt。查看它们并运行hive-f create.sql(它将删除“temp”表并重新创建),然后告诉我它是否适合您。另外,serde的jar也应该有版本号,但我不知道它安装在您的系统中的什么地方。
{"customerid":1,"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"]}
{"customerid":2,"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"]}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"],"customerid":1}}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"],"customerid":2}}