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')
答案 0 :(得分:2)
Hive不能包含动态列数,也不能包含动态列名。它必须能够在查询计划时确定整个模式(列数,类型和名称),而无需查看任何数据。
我也不清楚你是如何将输入记录完全匹配到一行中的。例如,你怎么知道哪个" 3"记录对应于" 5"记录。
如果您知道,例如,总会有一个" 3"记录和" 5"记录,你可以承诺那些是唯一的列名称,并且如果你有一致的方法将记录匹配到" flatten"这些数据,然后是可能的,但很难。我以前几乎完成了这个精确的操作,它涉及一个自定义UDTF和一个自定义UDAF,以及一些自动生成实际查询的代码,在某些情况下最终会长达数百行。我会首先重新评估你为什么要这样做,看看你是否能想出另一种方法。