我们正在尝试创建一个架构来将大量 JSON 结构加载到 Hive 中。然而,我们遇到了一个问题,因为某些字段的名称有前导下划线——在根级别,这很好,但我们还没有找到一种方法来使其适用于嵌套字段。
示例 JSON:
{
"_id" : "319FFE15FF908EDD86B7FDEADBEEFBD8D7284128841B14AA6A966923C268DF39",
"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.id" = "_id",
"mapping.somefield" = "_somefield"
);
此架构构建正常 - 但是,在加载上述示例后,“somefield”的值(嵌套+前导下划线)始终为空(所有其他值都存在并且正确)。
我们尝试了很多语法组合,但没有成功。
有人知道技巧来创建一个名称中带有前导下划线的嵌套字段吗?
干杯!
最佳答案
在这里回答我自己的问题:没有什么技巧,因为你做不到。
但是,有一个简单的解决方法:您可以告诉 Hive 在创建模式时将名称视为文字。如果这样做,您还需要使用相同的文字语法进行查询。在上面的例子中,它看起来像:
`_something` struct<rest_of_definitions>
没有任何特殊的 serde 属性。 然后在查询中再次使用:
select stuff.`_something` from sometable;
例如,架构:
create table testSample
(
id string,
something struct
<
`_somefield`:int,
anotherfield:bigint,
yetanotherfield:int
>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties("mapping.id" = "_id");
对于输入 JSON,例如:
{
"_id": "someuid",
"something":
{
"_somefield": 1,
"anotherfield": 2,
"yetanotherfield": 3
}
}
查询如下:
select something.`_somefield`
from testSample
where something.anotherfield = 2;
关于json - 在 Hive 中映射 JSON,其中嵌套字段具有下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684656/