web-dev-qa-db-ja.com

Hive Explode / Lateral View複数のアレイ

次のスキーマを持つ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

ただし、結果はデカルト積として出力されます。

16
user2726995

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;
15
Jerome Banks

私は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;
15

これを行うには、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を使用したり、さまざまな配列を結合したりする必要がなくなります(パフォーマンスが大幅に向上します)。

0
dataMD

私はあなたのシナリオで解決しようとしました...このコードを試してください-

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出力では、productidcategoryid、およびqtyの配列内の要素のインデックスを取得します。これが役立つことを願っています。

0