【问题标题】:How can I parse a Json column of a Hive table using a Json serde?如何使用 Json serde 解析 Hive 表的 Json 列?
【发布时间】:2015-06-04 09:15:16
【问题描述】:

我正在尝试根据事件的名称将反序列化的 json 事件加载到不同的表中。

现在我把所有的事件都放在同一个表中,表只有两列 EventName 和 Payload(payload 存储了事件的 json 表示):

CREATE TABLE event( EventName STRING, Payload STRING)

所以基本上我想要的是加载下表中的数据:

CREATE TABLE TempEvent ( Column1 STRING, Column2 STRING, Column3 STRING )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

并使用以下内容加载事件:

INSERT INTO TempEvent select Payload from event where EventName='TempEvent';

但是 hive 抛出一个异常,说目标表有 3 列,而 select 语句只有 1。

还有其他方法可以完成这个还是我做错了什么?

【问题讨论】:

    标签: json hadoop hive


    【解决方案1】:

    JSON serde 需要一个每行一个 JSON 的表才能使用它。所以它不适用于您的输入表,因为该行

    TempEvent, {"Column1":"value1","Column2":"value2","Column3":"value3"}
    

    不是有效的 JSON。所以首先你需要将它移动到一个只包含有效 JSON 的新中间表中,然后使用 load data 从那里填充 JSON serde 表:

    create table event_json (Payload string)
    stored as textfile;
    
    insert into table event_json 
    select Payload from event
    where EventName='TempEvent';
    
    create table TempEvent (Column1 string, Column2 string, Column3 string)
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe';
    
    load data inpath '/user/hive/warehouse/event_json' overwrite into table TempEvent;
    

    然后你可以像这样提取列:

    select Column1, Column2, Column3
    from TempEvent;
    

    当然,如果您的源表最初是有效的 JSON,则不需要所有这些处理,您可以将 TempEvent 表创建为 external table 并直接从中提取数据。

    【讨论】:

    • 感谢您的回答,尝试过,但在尝试访问 Payload 对象的任何子对象时出现错误,我得到了这个 。在尝试发出此查询时,仅结构或结构类型列表 'Column1' 支持运算符:select Payload.C​​olumn1 from TempEvent;
    • 嘿wichon,我已经编辑了我的答案,我不得不添加另一个步骤。希望它现在对你有用。
    • 谢谢兄弟,正是我所担心的,目前我正在从 Kinesis 流中读取事件,并且我将 EventName 添加到每个文档中以区分流中的事件,所以我想我将不得不将事件负载刷新到存储中,以便稍后将它们加载到各自的事件表中。
    • 当你添加EventName的时候,为什么不这样做:{EventName: "TempEvent", "Payload": {"Column1":"value1","Column2":"value2","Column3":"value3"}} 这样你就会有有效的JSON,你可以直接用serde读取。
    • 这是个好主意,我唯一担心的是事件的结构不会相同,但让我试试看,谢谢大家 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2023-01-07
    • 2020-09-05
    • 2013-05-02
    相关资源
    最近更新 更多