[英]Serde returns a SyntaxError “expected value” when deserializing nested JSON structs
[英]issue with Hive Serde dealing nested structs
我正在嘗試使用Json Serde加載具有嵌套結構的大量json數據以配置單元。 某些字段名稱在嵌套結構中以$
開頭。 我正在使用SerDeproperties
映射蜂巢文件名,但是當我查詢表時, 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"
);
此架構構建良好,但是,上表中的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"
);
我用一些測試數據進行了測試:
{ "_id" : "123", "something": { "$somefield": 12, "anotherfield":13,"yetanotherfield":100}}
hive> select something.somefield from testSample;
OK
12
我突然也開始看到此問題,但對於普通的列名也是如此(沒有特殊字符,如$)
我正在從另一個內部表(Table2)填充外部表(Temp),並希望以JSON格式輸出Temp表。 我希望在輸出JSON文件中使用駝峰式的列名,因此我也使用Temp表中的Serdepoperties指定正確的名稱。 但是,我看到當我從Temp表中選擇*時,它將為名稱已在映射中使用的列提供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;
從溫度中選擇*:
{"customerid":null,"region":"EU","marketplaceid":null,"asin":["B000FC1PZC"]}
{"customerid":null,"region":"EU","marketplaceid":null,"asin":["B000FC1C9G"]}
查看“ customerid”和“ marketplaceid”如何為空。 生成的JSON文件為:
{"data":{"region":"EU","asin":["B000FC1PZC"]}}
{"data":{"region":"EU","asin":["B000FC1C9G"]}}
現在,如果我刪除帶有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}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.