具有动态列数的sql配置单元表

b1uwtaje  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(379)
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')
fd3cxomn

fd3cxomn1#

配置单元不能具有动态列数,也不能具有动态列名。它必须能够在查询计划时确定整个模式(列计数、类型和名称),而不必查看任何数据。
我也不清楚你到底是如何将输入记录匹配到一行的。例如,您如何知道哪个“3”记录对应哪个“5”记录。
例如,如果您知道总是有一个“3”记录和一个“5”记录,并且您可以将它们作为唯一的列名,并且如果您有一种一致的方法来匹配记录以“展平”此数据,那么这是可能的,但很困难。我以前做过几乎完全相同的操作,它包括一个自定义udtf和一个自定义udaf,以及一些自动生成实际查询的代码,在某些情况下,这些代码会长达数百行。我会重新评估一下你为什么要这么做,看看你能不能想出另一种方法。

相关问题