在pyspark中使用用户定义的函数时使用df.show()时出错

时间:2019-11-16 15:07:53

标签: python apache-spark pyspark

我有这个示例数据框

import datetime
elevDF = sc.parallelize([
    (datetime.datetime(1984, 1, 1, 0, 0), 1, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 2, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 3, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 4, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 5, 638.55)
]).toDF(["date", "hour", "value"])

我想在此列中使用日期名称作为日期时间的字符串来创建df。

这是我尝试过的

## Creating udf function
import pyspark.sql.functions as F
from pyspark.sql.functions import month
from pyspark.sql.types import StringType
udfGetMonthName = F.udf(lambda col: month(col), StringType())

## Using udf function
elevDF.select(
    udfGetMonthName('date').alias('year')
).show()

但是,当我运行代码时,出现以下错误

Py4JJavaError: An error occurred while calling o1407.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 86.0 failed 4 times, most recent failure: Lost task 0.3 in stage 86.0 (TID 645, spark-m.asia-south1-c.c.cp-vision-239212.internal, executor 1)

我查看了以下链接建议,该建议表明这可能是一个实例问题(Issue with df.show() in pyspark)。重新启动内核,创建新实例。不工作。

任何人都可以帮助。非常感谢你。

1 个答案:

答案 0 :(得分:2)

AFAIK,您不能在UDF内部使用pyspark本机函数。这是分发python函数的一种方式。

但是,您可以尝试使用strftime这是一个Python datetime库函数:

elevUDF = F.udf(lambda x: x.strftime("%B"))

elevDF.withColumn("month_name", elevUDF("date")).show()
+-------------------+----+------+----------+
|               date|hour| value|month_name|
+-------------------+----+------+----------+
|1984-01-01 00:00:00|   1|638.55|   January|
|1984-01-01 00:00:00|   2|638.55|   January|
|1984-01-01 00:00:00|   3|638.55|   January|
|1984-01-01 00:00:00|   4|638.55|   January|
|1984-01-01 00:00:00|   5|638.55|   January|
+-------------------+----+------+----------+