Hive Explode / Lateral查看多个数组

时间:2013-12-18 20:11:46

标签: hive explode hiveql

我有一个包含以下架构的配置单元表:

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
然而,结果是笛卡尔积。

5 个答案:

答案 0 :(得分:15)

您可以使用Brickhouse中的numeric_rangearray_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;

答案 1 :(得分:13)

我在不使用任何UDF的情况下找到了解决此问题的非常好的解决方案, posexplode是一个非常好的解决方案:

SELECT COOKIE ,
ePRODUCT_ID,
eCAT_ID,
eQTY
FROM TABLE 
LATERAL VIEW posexplode(PRODUCT_ID) ePRODUCT_IDAS seqp, ePRODUCT_ID
LATERAL VIEW posexplode(CAT_ID) eCAT_ID AS seqc, eCAT_ID
LATERAL VIEW posexplode(QTY) eQTY AS seqq, eDateReported
WHERE seqp = seqc AND seqc = seqq;

答案 2 :(得分:0)

您可以使用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以及将各种阵列连接在一起(这具有更好的性能)。

答案 3 :(得分:0)

我尝试了解您的情况......请尝试使用此代码 -

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  在输出中,您将获得productidcategoryidqty数组中元素的索引。希望这会有所帮助。

答案 4 :(得分:0)

如果您在pyspark中使用Spark 2.4,请将arrays_zipposexplode结合使用:

df = (df
    .withColumn('zipped', arrays_zip('col1', 'col2'))
    .select('id', posexplode('zipped')))