我定义了以下功能:
def test_function(string):
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
lower_string = string.lower()
sid = SentimentIntensityAnalyzer()
res_dict = sid.polarity_scores(lower_string)
return res_dict
我通过执行以下操作将函数转换为udf以便将其传递到Pyspark数据帧:
udf_test_function = udf(lambda z: test_function(z), MapType(StringType(), DoubleType()))
我有一个pyspark数据框,即注释,只有一列,其中包含字符串。
+--------------------+
| comment|
+--------------------+
| nan|
| nan|
| nan|
|So far it has per...|
|I purchased it fo...|
+--------------------+
only showing top 5 rows
它具有以下模式:
root
|-- comment: string (nullable = true)
我通过以下方式将udf传递到数据帧:
test_result = comments.select('comment',udf_test_function('comment').alias('Result'))
此操作的结果应该是新的数据帧test_result,并且确实具有类型pyspark.sql.dataframe.DataFrame
,并且应该具有两列comment和Result。但是,当我尝试显示结果test_result.show(5)
时,出现以下错误:
Py4JJavaError: An error occurred while calling o161.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 7.0 failed 1 times, most recent failure: Lost task 0.0 in stage 7.0 (TID 10, localhost, executor driver): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed)
仅当我使用NLTK函数时才会发生这种情况,就像我将其他函数传递给数据框一样,它可以正常工作。
我正在使用Jupyter Notebook 4.4.0,在python 3.7.2上运行spark 2.4.0(所有安装在本地PC上);我的印象是,这更多是配置问题,而不是逻辑问题。
但是,由于我是配置Spark / Pyspark的新手,因此将不胜感激。
答案 0 :(得分:1)
我能够解决问题,这是配置问题,因为我没有将NLTK库发送到Spark安装的工作节点。 我遵循了本教程,并能够解决我的问题: NLTK in Spark tutorial
我还更正了该函数以更好地处理错误:
def vader_SID(input_string='Error'):
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()
try:
lower_string = input_string.lower()
res_dict = sid.polarity_scores(lower_string)
return res_dict
except ValueError:
print('Value Error!')
except AttributeError:
print('Atribute Error!')
except TypeError:
print('Type Error!')
该函数生成的数据帧为:
+--------------------+--------------------+
| comment| Result|
+--------------------+--------------------+
| nan|[neg -> 0.0, pos ...|
| nan|[neg -> 0.0, pos ...|
| nan|[neg -> 0.0, pos ...|
|So far it has per...|[neg -> 0.0, pos ...|
|I purchased it fo...|[neg -> 0.0, pos ...|
+--------------------+--------------------+
only showing top 5 rows