Hive 蜂巢分解/侧视图多个阵列
我有一个具有以下架构的配置单元表:Hive 蜂巢分解/侧视图多个阵列,hive,explode,hiveql,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
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()中的
数值范围和数组索引来解决此问题。有一篇信息丰富的博客文章详细描述了
使用这些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;
我找到了一个很好的解决方案,没有使用任何自定义项,
这是一个非常好的解决方案:
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;
选择COOKIE,
ePRODUCT_ID,
eCAT_ID,
设备数量
从桌子上
侧视图分解(产品ID)电子产品ID序列号,电子产品ID
侧视图分解(CAT_ID)eCAT_ID为seqc,eCAT_ID
侧视图位置分解(数量)设备数量如图所示,E已报告
其中,seqp=seqc,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;
注-在上述声明中,如果您-
从表中选择cookie、myprod、mycat、myqty
代替从表中选择cookie、productid[myprod]、categoryid[mycat]、qty[myqty]
在输出中,您将获得productid
、categoryid
和qty
数组中元素的索引。希望这会有所帮助。如果您在pyspark中使用Spark 2.4,请将数组\u zip
与posexplode一起使用:
df = (df
.withColumn('zipped', arrays_zip('col1', 'col2'))
.select('id', posexplode('zipped')))
嘿,这管用!我想需要注意的是,数组需要具有相同的长度,如果它们不具有相同的长度,则会将它们截断为最短数组的长度。我也不确定它的性能,尤其是在侧视图越来越多的情况下。是的,因为“WHERE seqp=seqc and seqc=seqq”,它将使用最短的一个,当然性能会受到影响。@Jerome。。如果阵列大小不同,这是否可以工作?我不确定不同的数组大小是否有意义。然后必须检查n是否大于当前数组。差不多。选择cookie,IF(n>=size(array1),array1,n,null),IF(n>=size(array2),array2,n)…这值得更多的投票!虽然多个posexplode的备选答案对于较小的表可能很好,但对于较大的表和较大数量的变量(要传递给posexplode),这是一种方法。