我正在尝试根据事件的名称将反序列化的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。
是否还有其他方法来实现这一点,或者我做错了什么?。
答案 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表并直接从中提取数据。