PySpark:在文本和子集数据框中搜索子字符串

Pin*_*ts0 2 string search substring subset pyspark

我是全新的pyspark,想将我现有的pandas/python代码转换为PySpark.

我想对 my 进行子集化,dataframe以便只'original_problem'返回包含我在字段中查找的特定关键字的行。

下面是我在 PySpark 中尝试的 Python 代码:

def pilot_discrep(input_file):

    df = input_file 

    searchfor = ['cat', 'dog', 'frog', 'fleece']

    df = df[df['original_problem'].str.contains('|'.join(searchfor))]

    return df 
Run Code Online (Sandbox Code Playgroud)

当我尝试运行上述程序时,出现以下错误:

AnalysisException: u"无法从 original_problem#207 中提取值:需要结构类型但得到字符串;"

may*_*wal 6

在 pyspark 中,试试这个:

df = df[df['original_problem'].rlike('|'.join(searchfor))]
Run Code Online (Sandbox Code Playgroud)

或等效地:

import pyspark.sql.functions as F
df.where(F.col('original_problem').rlike('|'.join(searchfor)))
Run Code Online (Sandbox Code Playgroud)

或者,您可以选择udf

import pyspark.sql.functions as F

searchfor = ['cat', 'dog', 'frog', 'fleece']
check_udf = F.udf(lambda x: x if x in searchfor else 'Not_present')

df = df.withColumn('check_presence', check_udf(F.col('original_problem')))
df = df.filter(df.check_presence != 'Not_present').drop('check_presence')
Run Code Online (Sandbox Code Playgroud)

但是 DataFrame 方法是首选,因为它们会更快。

  • 将 like 改为 `rlike` (2认同)