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

时间:2015-06-02 18:05:49

标签: json hadoop hive

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

现在我将所有事件放在同一个表中,该表只有两列EventName和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。

是否还有其他方法来实现这一点,或者我做错了什么?。

1 个答案:

答案 0 :(得分: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,那么所有这些处理都不是必需的,您可以像external table一样创建TempEvent表并直接从中提取数据。