Hive TRANSFORMは、連結された配列値に対してNULLを受け取ります

Aug 21 2020

私は次の形式のハイブテーブルを持っています:

   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              
    .
    .

col1のすべての値はcol2の複数の値を持つことができ、(col1、col2)のそのようなすべてのペアはcol3の複数の値を持つことができます。

クエリを実行しています[Q]

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

取得するため:

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

PythonUDFを使用していくつかの変換を実行したいと思います。したがって、次のようにTRANSFORM句を使用してこれらすべての列をUDFに渡します。

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

concat_wsを使用して、配列出力を区切り文字で連結されたcollect_listからstrigに変換しています。結果としてcol1、col2を取得しますが、col3出力を取得しません。

+---------+---------+
|      key|    value|
+---------+---------+
|a1       | b1      |
|         |     null|
|a1       | b2      |
|         |     null|
|a2       | b3      |
|         |     null|
|a2       | b4      |
|         |     null|
+---------+---------+

私のUDFには、stdinから受け取った行を出力するprintステートメントがあります。

import sys
for line in sys.stdin:
    try:
        print line
    except Exception as e:
        continue

誰かがUDFでcol3を取得できない理由を理解するのを手伝ってもらえますか?

回答

1 serge_k Aug 23 2020 at 02:41

まず、PythonUDFで行を解析する必要があります。

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

次に\t、concat_wsではなく他のものを使用することをお勧めします

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