Pyspark - 另一个列列表中的列项目
Pyspark - column item in another column list
我是 pyspark 的新手,我正在寻找 column2 项目列表中的 column1 项目。让我们举个例子。
让我们举一个简单的例子,使用 google 搜索 - 3 列 - query
- 字符串,hrefs
- 列表和 clicked_url
- 字符串,我需要检查是否clicked_url
在 hrefs
中。
可能会发生 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|
+------+--------------------+-----------+
我是 pyspark 的新手,我正在寻找 column2 项目列表中的 column1 项目。让我们举个例子。
让我们举一个简单的例子,使用 google 搜索 - 3 列 - query
- 字符串,hrefs
- 列表和 clicked_url
- 字符串,我需要检查是否clicked_url
在 hrefs
中。
可能会发生 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|
+------+--------------------+-----------+