合并大量的列

时间:2016-11-11 14:10:20

标签: sql hive hiveql coalesce

我在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;    

非常感谢您提前寻求帮助!

1 个答案:

答案 0 :(得分:0)

对于您在问题中描述的案例,我没有看到很多快捷方式。 您可以编写可以使用任意数量参数的自定义UDF(genericUDF),但是在调用UDF时仍然需要指定所有列。

对于注释中的情况(合并结构的许多元素),您可以编写一个仅接收结构作为参数的自定义UDF。 hive结构实际上表示为Object [],因此无论有多少函数都可以很容易地在struct元素上实现任何函数。

Here's an example一个genericUDF,它接收一个结构列表作为参数。