如何使用 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
并直接从中提取数据。
我正在尝试根据事件名称将反序列化的 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
并直接从中提取数据。