首页 > 解决方案 > Pyspark 同时从数据框中的 2 个列表中删除

问题描述

我在处理庞大的数据集时遇到问题,我正在寻找从 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]

标签: pythonlistpysparkpyspark-sqlpyspark-dataframes

解决方案


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.4array_removearrays_zipfilterzipped array(type_urls)type is 'adlink' and 'picture'columname.arrayname

Filter(高阶函数),基本上允许您将过滤器应用于高阶数据,而不必分解它(正如您提到的那样 posexplode高阶函数

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

from pyspark.sql import functions as F
df.withColumn("type_urls", F.arrays_zip(F.col("urls"),F.col("type"))).select("type_urls")\
  .withColumn("urls1", F.expr("""filter(type_urls, x-> x.type!='adlink' and x.type!='picture')"""))\
  .select(F.col("urls1.urls"), F.col("urls1.type")).show(truncate=False)

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

推荐阅读