Pyspark同时从数据框的2个列表中删除

时间:2020-04-09 21:47:10

标签: python list pyspark pyspark-sql pyspark-dataframes

我在处理庞大的数据集时遇到问题,我正在寻找从2个列表中删除相同的索引项目。

让我描述一个例子。

想象一下Google搜索-页面中12个URL的列表。第一个也是广告,最后一个也是,第二和第七个是图片链接。现在,我只想 个有机link

类型可以在列表中随机放置。我正在检查array_remove,它非常好,但是它只能从1个列表中删除特定的项目,而我还不够先进,无法弄清楚如何对2个列表同时进行。遗憾的是,数据集确实很大,我担心posexplode在这里对我来说不是一个选择。

请记住,这是列表的一列,而不是单个项目的一列。

我正在寻找类似的东西

if "adlink" or "picture" in typelist:
   remove it from typelist and remove same indexed item from urls list
  urls  |  type 
-----------------
[url1,  | [adlink, 
 url2,  |  picture,
 url3,  |  link,
 url4,  |  link,
 url5,  |  link, 
 url6,  |  link,
 url7,  |  picture,
 url8,  |  link,
 url9,  |  link,
 url10, |  link,
 url11, |  link,
 url12] |  adlink]

所需的输出:

  urls  |  type 
-----------------
[url3,  | [link,
 url4,  |  link,
 url5,  |  link, 
 url6,  |  link,
 url8,  |  link,
 url9,  |  link,
 url10, |  link,
 url11] |  link]

1 个答案:

答案 0 :(得分:2)

df.show()#your dataframe
+---------------------------------------------------------------------------+----------------------------------------------------------------------------------+
|urls                                                                       |type                                                                              |
+---------------------------------------------------------------------------+----------------------------------------------------------------------------------+
|[url1, url2, url3, url4, url5, url6, url7, url8, url9, url10, url11, url12]|[adlink, picture, link, link, link, link, picture, link, link, link, link, adlink]|
+---------------------------------------------------------------------------+----------------------------------------------------------------------------------+ 

您可以像使用 higher order functions 一样使用 spark2.4 (我知道是因为您使用了 array_remove )。首先,您可以使用 arrays_zip 将数组 zip 压缩在一起,然后在 {上使用 filter {1}} 过滤掉 zipped array(type_urls) ,然后使用 {{1} }

type is 'adlink' and 'picture' (高阶函数),基本上可以让您将过滤器应用于高阶数据,而不必将其爆炸(如您提到的 posexplode Higher order functions

columname.arrayname 返回结构的合并数组,其中第N个结构包含输入数组的所有第N个值。 arrays_zip Pyspark API docs

Filter