3

我正在使用 Hive 0.13.1,并创建了一个自定义 SerDe,它能够处理一种特殊的 xml 数据。到目前为止,一切都很好。我还为拆分输入数据的 InputFormat 创建了一个类。

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

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

可以说我有一个这样的xml:

<item>
  <id>0</id>
  <timestamp>00:00:00</timestamp>
  <subitemlist>
    <subitem>1</subitem>
    <subitem>2</subitem>
  </subitemlist>
</item>

我的 SerDe 获取了整个项目块,我现在要做的是为每个在 Hive中创建一个<subitem>id 的行。<item>

我无法调整 InputFormat 类,因为问题并不像本例中那样微不足道:)

4

2 回答 2

0

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

我认为最好的方法是有一张像

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
于 2015-12-17T01:45:14.100 回答
0

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

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

是的,你可能是对的。问题是我需要根据很多列的数据做一些处理。因此,UDF 会增加太多的复杂性。不过,还是谢谢你的回答。

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

于 2016-01-21T08:02:04.303 回答