具有动态列数的Hive表

时间:2014-09-25 12:08:00

标签: sql hadoop hive analytics bigdata

TestTable
inputsCOLUMN       
3-300-150-150-R     
3-200-100-100-A     
5-500-00-500-A


output
 3_open   3_spent   3_closing   3_type   5_open   5_spent   5_closing   5_type
-------- --------- ----------- -------- -------- --------- ----------- --------
   300    150       150         R        500      00        500         A
   200    100       100         A

上面是名为TestTable的输入表。它有两列包含数据行(字符串) 并且有一个所需的输出表,其列名基于输入字符串。 列名是字符串上的第一个数字+另一个字符串名称,如CONCAT(split(inputsCOLUMN,'\\-')[0],'-','type')

以便输出是所需的输出。因为当我试图连接别名时我认为不允许,因此下面的查询没有按预期工作。如果有办法可以找到所需的输出,请帮助我。

SELECT split(inputsCOLUMN,'\\-')[1] as CONCAT(split(inputsCOLUMN,'\\-')[0],'-','open'),
       split(inputsCOLUMN,'\\-')[2] as CONCAT(split(inputsCOLUMN,'\\-')[0],'-','spent'),
       split(inputsCOLUMN,'\\-')[3] as CONCAT(split(inputsCOLUMN,'\\-')[0],'-','closing'),
       split(inputsCOLUMN,'\\-')[4] as CONCAT(split(inputsCOLUMN,'\\-')[0],'-','type')

1 个答案:

答案 0 :(得分:2)

Hive不能包含动态列数,也不能包含动态列名。它必须能够在查询计划时确定整个模式(列数,类型和名称),而无需查看任何数据。

我也不清楚你是如何将输入记录完全匹配到一行中的。例如,你怎么知道哪个" 3"记录对应于" 5"记录。

如果您知道,例如,总会有一个" 3"记录和" 5"记录,你可以承诺那些是唯一的列名称,并且如果你有一致的方法将记录匹配到" flatten"这些数据,然后是可能的,但很难。我以前几乎完成了这个精确的操作,它涉及一个自定义UDTF和一个自定义UDAF,以及一些自动生成实际查询的代码,在某些情况下最终会长达数百行。我会首先重新评估你为什么要这样做,看看你是否能想出另一种方法。