如何将字典从用户定义的函数返回到pyspark数据框?

时间:2019-03-04 17:24:11

标签: python apache-spark dataframe pyspark

我定义了以下功能:

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的新手,因此将不胜感激。

1 个答案:

答案 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