次のスキーマを持つHiveテーブルがあります。
COOKIE | PRODUCT_ID | CAT_ID | QTY
1234123 [1,2,3] [r,t,null] [2,1,null]
配列を正規化して次の結果を得るにはどうすればよいですか
COOKIE | PRODUCT_ID | CAT_ID | QTY
1234123 [1] [r] [2]
1234123 [2] [t] [1]
1234123 [3] null null
私は次を試しました:
select concat_ws('|',visid_high,visid_low) as cookie
,pid
,catid
,qty
from table
lateral view explode(productid) ptable as pid
lateral view explode(catalogId) ptable2 as catid
lateral view explode(qty) ptable3 as qty
ただし、結果はデカルト積として出力されます。
Brickhouseのnumeric_range
およびarray_index
UDF( http://github.com/klout/brickhouse )を使用して、この問題を解決します。 http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-で詳細を説明する有益なブログ投稿がありますwith-numeric_range /
これらのUDFを使用すると、クエリは次のようになります
select cookie,
array_index( product_id_arr, n ) as product_id,
array_index( catalog_id_arr, n ) as catalog_id,
array_index( qty_id_arr, n ) as qty
from table
lateral view numeric_range( size( product_id_arr )) n1 as n;
私はUDFを使用せずにこの問題の非常に良い解決策を見つけました、 posexplode は非常に良い解決策です:
SELECT COOKIE、 ePRODUCT_ID、 eCAT_ID、 eQTY FROM TABLE LATERAL VIEW posexplode(PRODUCT_ID)ePRODUCT_IDAS seqp、ePRODUCT_ID 側面図posexplode(CAT_ID)eCAT_ID AS seqc、eCAT_ID 側面図posexplode(QTY)eQTY AS seqq、eDateReported WHERE seqp = seqc AND seqc = seqq;
これを行うには、posexplodeを使用します。これは、0〜nの整数を提供して、配列内の各要素の配列内の位置を示します。次に、この整数を使用します-pos(位置)を呼び出して、次のようにブロック表記を使用して他の配列の一致する値を取得します。
select
cookie,
n.pos as position,
n.prd_id as product_id,
cat_id[pos] as catalog_id,
qty[pos] as qty
from table
lateral view posexplode(product_id_arr) n as pos, prd_id;
これにより、インポートされたUDFを使用したり、さまざまな配列を結合したりする必要がなくなります(パフォーマンスが大幅に向上します)。
私はあなたのシナリオで解決しようとしました...このコードを試してください-
create table info(cookie string,productid int,catid string,qty string);
insert into table info
select cookie,productid[myprod],categoryid[mycat],qty[myqty] from table
lateral view posexplode(productid) pro as myprod,pro
lateral view posexplode(categoryid) cate as mycat,cate
lateral view posexplode(qty) q as myqty,q
where myprod=mycat and mycat=myqty;
注-上記のステートメントで、-select cookie,myprod,mycat,myqty from table
代わりに select cookie,productid[myprod],categoryid[mycat],qty[myqty] from table
出力では、productid
、categoryid
、およびqty
の配列内の要素のインデックスを取得します。これが役立つことを願っています。