Hive TRANSFORM对于串联的数组值接收到NULL

问题描述

我有一个蜂巢表,格式为:

:root {
  --foo: #900;
  --foo-rgb: 153,0;
  --foo-dim: rgba(153,0.5);
  --foo-dim: rgba(var(--foo-rgb),0.5);
}

.button {
  background-color: var(--foo-dim);
}

col1 中的每个值可以在 col2 中具有多个值,而每对这样的(col1,col2)对可以具有多个 col3 。

我正在运行查询 [Q]

member2(X,[X|_]).
member2(X,[_|T]) :- member2(X,T),X > T,write(X).

获得:

   col1.      col2.     col3.
    a1          b1       c1
    a1          b1       c2                                  
    a1          b2       c2
    a1          b2       c3              
    a2          b3       c1
    a2          b4       c1                                  
    a2          b4       c2
    a2          b4       c3              
    .
    .

我想使用python UDF进行一些转换。因此,我使用TRANSFORM子句将所有这些列传递给UDF:

select col1,col2,collect_list(col3) from {table} group by col1,col2;

我正在使用concat_ws将数组输出从由分隔符连接的collect_list转换为strig。我得到的是col1,col2,但没有得到col3的输出。

a1   b1   [c1,c2]
a1   b2   [c2,c3]
a2   b3   [c1]
a2   b4   [c1,c2,c3] 

在我的UDF中,我只有一条打印语句,用于打印从stdin接收到的行。

select TRANSFORM ( * ) using 'python udf.py' FROM 
(
select col1,concat_ws('\t',collect_list(col3)) from {table} group by col1,col2;
)

有人可以帮我弄清楚为什么我的UDF中没有col3吗?

解决方法

首先,您需要在Python UDF中解析该行,例如

import sys
for line in sys.stdin:
    try:
        line = line.strip('\n')
        col1,col2,col3 = line.split('\t')
        print '\t'.join([col1,col3])
    except Exception as e:
        continue

然后最好在concat_ws中使用其他内容代替\t

select TRANSFORM ( * )  using 'python udf.py' as (col1,col3)
FROM 
(
select col1,concat_ws(',',collect_list(col3)) from {table} group by col1,col2;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...