我有这个示例数据框
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)。重新启动内核,创建新实例。不工作。
任何人都可以帮助。非常感谢你。
答案 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|
+-------------------+----+------+----------+