簡體   English   中英

Hive Serde處理嵌套結構的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM