使用PySpark数据帧我尝试尽可能高效地执行以下操作。我有一个数据框,其中包含一个包含文本的列和一个我想要按行筛选的单词列表。所以:
Dataframe看起来像这样
df:
col1 col2 col_with_text
a b foo is tasty
12 34 blah blahhh
yeh 0 bar of yums
列表为list = [foo,bar]
因此结果将是:
result:
col1 col2 col_with_text
a b foo
yeh 0 bar
之后不仅会进行相同的字符串匹配,还会使用SequenceMatcher左右测试相似性。这就是我已经尝试过的:
def check_keywords(x):
words_list = ['foo','bar']
for word in x
if word == words_list[0] or word == words_list[1]:
return x
result = df.map(lambda x: check_keywords(x)).collect()
不幸的是我没有成功,有人可以帮我吗? 提前谢谢。
答案 0 :(得分:5)
您应该考虑使用pyspark sql模块函数而不是编写UDF
,有几个基于regexp
的函数:
首先让我们从更完整的样本数据框开始:
df = sc.parallelize([["a","b","foo is tasty"],["12","34","blah blahhh"],["yeh","0","bar of yums"],
['haha', '1', 'foobar none'], ['hehe', '2', 'something bar else']])\
.toDF(["col1","col2","col_with_text"])
如果您想根据行中是否包含words_list
中的某个字词来过滤行,您可以使用rlike
:
import pyspark.sql.functions as psf
words_list = ['foo','bar']
df.filter(psf.col('col_with_text').rlike('(^|\s)(' + '|'.join(words_list) + ')(\s|$)')).show()
+----+----+------------------+
|col1|col2| col_with_text|
+----+----+------------------+
| a| b| foo is tasty|
| yeh| 0| bar of yums|
|hehe| 2|something bar else|
+----+----+------------------+
如果要提取与正则表达式匹配的字符串,可以使用regexp_extract
:
df.withColumn(
'extracted_word',
psf.regexp_extract('col_with_text', '(?=^|\s)(' + '|'.join(words_list) + ')(?=\s|$)', 0))\
.show()
+----+----+------------------+--------------+
|col1|col2| col_with_text|extracted_word|
+----+----+------------------+--------------+
| a| b| foo is tasty| foo|
| 12| 34| blah blahhh| |
| yeh| 0| bar of yums| bar|
|haha| 1| foobar none| |
|hehe| 2|something bar else| |
+----+----+------------------+--------------+
答案 1 :(得分:0)
我已经尝试了这个,如果你改变单词列表。
words_list = ['foo', 'is', 'bar']
结果保持不变,并且没有显示其他词语。
+----+----+------------------+--------------+
|col1|col2| col_with_text|extracted_word|
+----+----+------------------+--------------+
| a| b| foo is tasty| foo|
| 12| 34| blah blahhh| |
| yeh| 0| bar of yums| bar|
|haha| 1| foobar none| |
|hehe| 2|something bar else| |
+----+----+------------------+--------------+