我正在使用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类,因为这个问题不像在这个例子中那么简单:)
答案 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。