我有一个包含以下架构的配置单元表:
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
然而,结果是笛卡尔积。
答案 0 :(得分:15)
您可以使用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;
答案 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
在输出中,您将获得productid
,categoryid
和qty
数组中元素的索引。希望这会有所帮助。
答案 4 :(得分:0)
如果您在pyspark中使用Spark 2.4,请将arrays_zip
与posexplode
结合使用:
df = (df
.withColumn('zipped', arrays_zip('col1', 'col2'))
.select('id', posexplode('zipped')))