Pyspark - 另一个列列表中的列项目

Pyspark - column item in another column list

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

让我们举一个简单的例子,使用 google 搜索 - 3 列 - query - 字符串,hrefs - 列表和 clicked_url - 字符串,我需要检查是否clicked_urlhrefs 中。

可能会发生 3 种情况:

如果 clicked_url 在 hrefs 列表中,则保留该行

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

如果 clicked_url 为空(没有 clicked_url),则保留该行,但将 clicked_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

提前致谢!

试试这个:

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