另一列列表中的Pyspark列项

2024-09-26 21:53:36 发布

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

我是pyspark的新手,我想在column2项目列表中找到column1项目。让我们举个例子

让我们用google search-3列来举一个简单的例子-query-string、hrefs-list和clicked_url-string,我需要检查clicked_url是否在hrefs

可能出现3种情况:

如果单击的url在hrefs列表中,则保留该行

如果单击的url不在hrefs列表中,则过滤掉该行-删除。(你可以想象一下点击广告)

如果单击的url为空(没有单击的url),则保留该行,但将单击的url的值更改为0

query  |    hrefs       | clicked_url 
------------------------------------
car    |[url1,...url10] | url1
monkey |[url11,...url20]| url11
mouse  |[url21,...url30]| url11
donkey |[url31,...url40]| "" - empty string
ball   |[url41,...url50]| url45
monkey |[url11,...url20]| url1

期望输出:

query  |    hrefs       | clicked_url 
------------------------------------
car    |[url1,...url10] | url1
monkey |[url11,...url20]| url11
donkey |[url31,...url40]| 0
ball   |[url41,...url50]| url45

提前谢谢


Tags: 项目url列表stringquerycar例子monkey
2条回答

试试这个:

df.createTempView('data')
new_df = spark.sqlContext.sql("""
select query
       , hrefs
       , case when clicked_url='' then '0' else clicked_url end as clicked_url
from data
where array_contains(hrefs, clicked_url) or clicked_url=''
""")
new_df.show()

Pyspark实现这一点的方法:

对于array_contains您只需使用表达式F.expr即可将value部分作为列发送

from pyspark.sql import functions as F
df.withColumn("clicked_url", F.when(F.col("clicked_url")=="", F.lit(0)).otherwise(F.col("clicked_url")))\
  .withColumn("boolean", F.expr("""array_contains(hrefs,clicked_url)"""))\
  .filter("boolean=true or clicked_url=0").drop("boolean").show()

+   +          +     -+
| query|               hrefs|clicked_url|
+   +          +     -+
|   car|       [url1, url10]|       url1|
|monkey|      [url11, url20]|      url11|
|donkey|      [url31, url40]|          0|
|  ball|[url41, url45, ur...|      url45|
+   +          +     -+

由于.filter也可以接受expression,因此您只能在那里输入array_contains

from pyspark.sql import functions as F
df.withColumn("clicked_url", F.when(F.col("clicked_url")=="", F.lit(0))\
              .otherwise(F.col("clicked_url")))\
  .filter("array_contains(hrefs,clicked_url)=true or clicked_url=0").show()

+   +          +     -+
| query|               hrefs|clicked_url|
+   +          +     -+
|   car|       [url1, url10]|       url1|
|monkey|      [url11, url20]|      url11|
|donkey|      [url31, url40]|          0|
|  ball|[url41, url45, ur...|      url45|
+   +          +     -+

相关问题 更多 >

    热门问题