如何使用 Json serde 解析 Hive table 的 Json 列?

How can I parse a Json column of a Hive table using a Json serde?

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

现在我将所有事件都放在同一个 table 中,table 只有两列 EventName 和 Payload(有效负载存储事件的 json 表示):

CREATE TABLE event( EventName STRING, Payload STRING)

所以基本上我想要的是在下面加载数据table:

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';

但是配置单元抛出一个异常,说目标 table 有 3 列,而 select 语句只有 1。

有没有其他方法可以完成这个或者我做错了什么?

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

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

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

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;

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