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),这是一种方法。