我在Hive的一张桌子上工作,有几十亿行和一百多列。
我需要合并100列中的第一个非零值。我能够做到这一点,但它涉及许多行代码(每列一行)。我还必须创建另一个反向相同的列来查找最后一个非零值,这意味着至少另外100个。每个列具有相同的命名约定,所以balance0,balance1,balance2等。
我想知道是否有更好的方法可以用更少的代码行完成这项工作?我在网上搜索过,可以找到很多关于合并值的信息,但我似乎无法找到任何有助于减少所需编码行的内容。
我正在使用的代码的简化版本如下:
SELECT urn
,COALESCE( IF( balance0 <> '0', balance0, NULL )
,IF( balance1 <> '0', balance1, NULL )
,IF( balance2 <> '0', balance2, NULL )
,IF( balance3 <> '0', balance3, NULL )
,IF( balance4 <> '0', balance4, NULL )
,IF( balance5 <> '0', balance5, NULL )
,IF( balance6 <> '0', balance6, NULL )
,IF( balance7 <> '0', balance7, NULL )
,IF( balance8 <> '0', balance8, NULL )
,IF( balance9 <> '0', balance9, NULL )
,IF( balance10 <> '0', balance10, NULL )
,IF( balance11 <> '0', balance11, NULL )
,IF( balance12 <> '0', balance12, NULL )
,IF( balance13 <> '0', balance13, NULL )
,IF( balance14 <> '0', balance14, NULL )
,IF( balance15 <> '0', balance15, NULL )
,IF( balance16 <> '0', balance16, NULL )
,IF( balance17 <> '0', balance17, NULL )
,IF( balance18 <> '0', balance18, NULL )
,IF( balance19 <> '0', balance19, NULL )
,IF( balance20 <> '0', balance20, NULL )
,IF( balanceX.... etc to balance100
)
AS first_positive_balance
FROM table_x;
非常感谢您提前寻求帮助!
答案 0 :(得分:0)
对于您在问题中描述的案例,我没有看到很多快捷方式。 您可以编写可以使用任意数量参数的自定义UDF(genericUDF),但是在调用UDF时仍然需要指定所有列。
对于注释中的情况(合并结构的许多元素),您可以编写一个仅接收结构作为参数的自定义UDF。 hive结构实际上表示为Object [],因此无论有多少函数都可以很容易地在struct元素上实现任何函数。
Here's an example一个genericUDF,它接收一个结构列表作为参数。