Pyspark同时从dataframe中的2个列表中删除

2024-07-05 15:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的数据集问题,我正在寻找从2个列表删除相同的索引项

让我描述一个例子

想象一下,谷歌搜索页面上有12个URL。第一个是广告,最后一个也是,第二个和第七个是图片链接。现在我只想要有机的

类型可以在列表中随机定位。我正在检查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]

Tags: 数据from列表typelinkurlsremovepicture
1条回答
网友
1楼 · 发布于 2024-07-05 15:19:09
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将数组压缩到一起,然后使用filter上的zipped array(type_urls)过滤掉任何type is 'adlink' and 'picture',然后使用columname.arrayname从压缩的列中选择所需的列

Filter(高阶函数),基本上允许您对高阶数据应用过滤器,而无需对其进行分解(正如您提到的posexplodeHigher order functions

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

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]|
+                         +                        +

相关问题 更多 >