Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用其他数据帧中的关键字筛选Spark数据帧_Python_Apache Spark_Pyspark_Pyspark Sql - Fatal编程技术网

Python 使用其他数据帧中的关键字筛选Spark数据帧

Python 使用其他数据帧中的关键字筛选Spark数据帧,python,apache-spark,pyspark,pyspark-sql,Python,Apache Spark,Pyspark,Pyspark Sql,我有一个大的新闻文章数据集加载到PySpark数据框架中。我感兴趣的是将数据框过滤到一组文章中,这些文章的正文中包含某些感兴趣的单词。目前,关键字列表很小,但我还是希望将它们存储在数据框中,因为该列表将来可能会扩展。考虑下面的小例子: from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() article_df = [{'source': 'a', 'body': 'Seattle is i

我有一个大的新闻文章数据集加载到PySpark数据框架中。我感兴趣的是将数据框过滤到一组文章中,这些文章的正文中包含某些感兴趣的单词。目前,关键字列表很小,但我还是希望将它们存储在数据框中,因为该列表将来可能会扩展。考虑下面的小例子:

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

article_df = [{'source': 'a', 'body': 'Seattle is in Washington.'},
                {'source': 'b', 'body': 'Los Angeles is in California'},
                {'source': 'a', 'body': 'Banana is a fruit'}]
article_data = spark.createDataFrame(article_data)

keyword_data = [{'city': 'Seattle', 'state': 'Washington'},
                {'city': 'Los Angeles', 'state': 'California'}]
keyword_df = spark.createDataFrame(keyword_data)
这为我们提供了以下数据帧:

+--------------------+------+
|                body|source|
+--------------------+------+
|Seattle is in Was...|     a|
|Los Angeles is in...|     b|
|   Banana is a fruit|     a|
+--------------------+------+

+-----------+----------+
|       city|     state|
+-----------+----------+
|    Seattle|Washington|
|Los Angeles|California|
+-----------+----------+
作为第一步,我想筛选
article_df
,这样它只包含
body
字符串包含
关键字_df['city']
中任何字符串的文章。我还想将其筛选为包含
关键字_df['city']
中的字符串和
关键字_df['state']
中的相应条目(同一行)的文章。我怎样才能做到这一点

我已经通过手动定义的关键字列表实现了这一点:

from pyspark.sql.functions import udf
from pyspark.sql.types import BooleanType
def city_filter(x):
    cities = ['Seattle', 'Los Angeles']
    x = x.lower()
    return any(s.lower() in x for s in cities)
filterUDF = udf(city_filter, BooleanType())
然后
article_-df.filter(filterUDF(article_-df.body)).show()给出所需的结果:

+--------------------+------+
|                body|source|
+--------------------+------+
|Seattle is in Was...|     a|
|Los Angeles is in...|     b|
+--------------------+------+

我如何实现这个过滤器而不必手动定义关键字列表(或关键字对的元组)?我是否需要为此使用UDF?

您可以使用
leftsemi
join with custom expression来实现它,例如:

body_contains_city = expr('body like concat("%", city, "%")')
article_df.join(keyword_df, body_contains_city, 'leftsemi').show()

您可以使用
leftsemi
join with custom expression实现它,例如:

body_contains_city = expr('body like concat("%", city, "%")')
article_df.join(keyword_df, body_contains_city, 'leftsemi').show()

这就成功了!值得一提的是,它也可以在没有显示正确结果的情况下完成:
article_df.join(关键字_df,article_df['body'])。contains(关键字_df['city']),'left_semi')
。这就成功了!值得一提的是,它也可以在不使用
expr
的情况下完成:
article\u-df.join(关键字\u-df,article\u-df['body'])。contains(关键字\u-df['city']),'left\u-semi')
似乎也给出了正确的结果。