【问题标题】:Can not collect data after mapping a function to a pyspark RDD将函数映射到 pyspark RDD 后无法收集数据
【发布时间】:2019-02-28 20:17:46
【问题描述】:

我有一列 pyspark.sql.dataframe.DataFrame (cmets) 它看起来像这样:

+--------------------+
|             comment|
+--------------------+
|                 nan|
|                 nan|
|                 nan|
|So far it has per...|
|I purchased it fo...|
+--------------------+

我直接从这个数据框中映射了一个函数:

tokens_rdd = comments.select('comment').rdd.flatMap(lambda x: word_tokenizer(x))

在此之后,我将 RDD 转换回数据框,如下所示:

tokens = sq.createDataFrame(tokens_rdd,comments.schema)

在此之后,我尝试显示数据框的前五行,但出现以下错误:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 2.0 failed 1 times, most recent failure: Lost task 0.0 in stage 2.0 (TID 3, localhost, executor driver): java.net.SocketException: Connection reset

我在本地使用 pyspark 2.4.0,我正在映射的功能是:

def word_tokenizer(x):
    import nltk
    lowerW = x.lower()
    return nltk.word_tokenize(x)

我尝试了一些将RDD转换为DF的方法,但我没有成功显示数据,也许有人可以帮我弄清楚。

提前致谢。

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    在与RDDDataframes 和Datasets 相互转换时,有几个帮助函数。我相信您尝试过的是将 local 列表转换为Dataframes。

    如果您有一个现有的RDD,那么您应该可以使用.toDF() 方法。

    假设 nltk.word_tokenize(x) 返回单个令牌字符串列表:

    tokens_df = tokens_rdd.toDF("tokens")
    

    应该是你所需要的。

    【讨论】:

    • 我比较熟悉scala API,"tokens"参数可能需要["tokens"]
    • 非常感谢,我忘了指定该函数读取一个字符串并返回一个python列表,如下所示:word_tokenizer('how are you'),返回['how', 'are', 'you'],正如你所说,我使用了错误的函数转换为数据框。
    猜你喜欢
    • 2020-12-16
    • 2017-11-29
    • 2016-04-11
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多