Pyspark 如何查询列在另一列中的位置?

Pyspark 如何查询列在另一列中的位置?,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一个dataframe,其中包含带有页面名称的列,另一个列包含带有页面列表的Json。我想检查页面名称是否出现在页面列表中,如果没有,则对其进行过滤 我怎么做 例如: +---------+--------------------------------+ |page name|page_list | +---------+--------------------------------+ |home |{page_list:['home'

我有一个dataframe,其中包含带有页面名称的列,另一个列包含带有页面列表的Json。我想检查页面名称是否出现在页面列表中,如果没有,则对其进行过滤

我怎么做

例如:

+---------+--------------------------------+
|page name|page_list                       |
+---------+--------------------------------+
|home     |{page_list:['home','something']}|
|about    |{page_list:['something']}       |
+---------+--------------------------------+
以下是一种方法:

df2 = (df
      .rdd
      .map(lambda x: (x.page_name, x.page_list, x.page_name in x.page_list['page_list']))
      .toDF(["page_name", "page_list", "flag"])

df2.show()

+---------+--------------------+-----+
|page_name|           page_list| flag|
+---------+--------------------+-----+
|     home|[page_list -> [ho...| true|
|    about|[page_list -> [so...|false|
+---------+--------------------+-----+

假设您的DataFrame架构如下所示(此处
page\u list
列是一个字符串):

您可以使用以字符串数组的形式获取
页面列表
。然后使用检查
页面名称是否在此列表中

诀窍是您必须使用to
array\u contains

from pyspark.sql.types import StructType, StructField, ArrayType, StringType
from pyspark.sql.functions import expr, from_json

df.withColumn(
    "flag",
    from_json(
        "page_list", 
        schema=StructType([StructField("page_list", ArrayType(StringType()))])
    )["page_list"]
).withColumn(
    "flag",
    expr("array_contains(flag, page_name)")
).show(truncate=False)
#+---------+----------------------------------+-----+
#|page_name|page_list                         |flag |
#+---------+----------------------------------+-----+
#|home     |{"page_list":["home","something"]}|true |
#|about    |{"page_list":["something"]}       |false|
#+---------+----------------------------------+-----+

如果列
page\u list
的类型为string,则可以简单地使用如下函数:

quoted_page_name = concat(lit("'"), col("page_name"), lit("'"))    
df.withColumn("flag", col("page_list").contains(quoted_page_name)).show()
给出:

+---------+----------------------------------+-----+
|page_name|page_list                         |flag |
+---------+----------------------------------+-----+
|home     |{page_list: ['home', 'something']}|true |
|about    |{page_list: ['something']}        |false|
+---------+----------------------------------+-----+

我建议不要这样做-如果
page\u name
列在
page\u列表中的任何位置显示为子字符串,它就会中断。例如:
{page\u list:['xxxhomeyyy']}
会错误地与
home
@pault匹配是的,如果按原样使用,我同意。但是可以简单地引用页面名称,即
'home'
…使用
concat(lit(“”),col(“page_name”),lit(“”)
,它应该给出正确的结果。
+---------+----------------------------------+-----+
|page_name|page_list                         |flag |
+---------+----------------------------------+-----+
|home     |{page_list: ['home', 'something']}|true |
|about    |{page_list: ['something']}        |false|
+---------+----------------------------------+-----+