Hive自定义SerDe可以生成多行吗?

时间:2015-12-11 12:50:47

标签: hive apache-hive

我正在使用Hive 0.13.1并且我创建了一个能够处理特殊类型的xml数据的自定义SerDe。到现在为止还挺好。 我还为InputFormat创建了一个用于分割输入数据的类。

我可以在自定义SerDe(或我的SerDe中的其他地方)的deserialize()函数中生成多行(输出)吗?

这样我就可以创建例如一个分裂中的两行? 在deserialize函数中,据我所知(在其他SerDe类中),返回值只是一个List(一行的值),并且将显示为一行。

假设我有一个像这样的xml:

<Grid Grid.ColumnSpan="7" Background="Transparent" ManipulationMode="TranslateX" ManipulationStarted="..." ManipulationCompleted="..." />

我的SerDe获取整个项目块,我现在要做的是为每个<item> <id>0</id> <timestamp>00:00:00</timestamp> <subitemlist> <subitem>1</subitem> <subitem>2</subitem> </subitemlist> </item> 创建一行,其中ID为<subitem>

我无法调整InputFormat类,因为这个问题不像在这个例子中那么简单:)

2 个答案:

答案 0 :(得分:0)

不,这是不可能的。 SerDe接口一次序列化/反序列化一条记录,因为这是序列化应该做的事情。 通常,让SerDe实际转换数据不是一个好的设计决策,这就是查询,UDF和UDTF的用途。 SerDe的目的基本上是将数据格式映射到等效的hive模式。

我认为最好的办法就是拥有一张像

这样的表格
create table xmltable ( 
  id int,
  ts timestamp,
  subitems array<int>
)

使用此serde的内容,然后创建另一个表作为视图

CREATE myview AS
  select id, sb FROM xmltable LATERAL VIEW explode(subitems) sb1 AS sb

答案 1 :(得分:0)

好的,谢谢你的回答罗伯托。

  

一般来说,让SerDe实际转换数据不是一个好的设计决策,这就是查询,UDF和UDTF的用途

是的,你可能是对的。问题是我需要根据许多列的数据进行一些处理。因此,UDF会增加太多的复杂性。但是,谢谢你的回答。

我现在通过在我的InputFormat类中调整next() - 方法来解决它。 (我知道我说我不想这样做,但是......)。 所以我正在分析<item>标记,并且对于每个<subitem>我将整个项目返回给SerDe。