Pyspark将列的类型从日期更改为字符串

10
我有以下数据框:
corr_temp_df
[('vacationdate', 'date'),
 ('valueE', 'string'),
 ('valueD', 'string'),
 ('valueC', 'string'),
 ('valueB', 'string'),
 ('valueA', 'string')]

现在我想将列vacationdate的数据类型更改为字符串,这样数据框架也将采用这种新类型并覆盖所有条目的数据类型。例如,写入以下内容后:

corr_temp_df.dtypes

需要覆盖 vacationdate 的数据类型。

我已经使用了像 cast、StringType 或 astype 这样的函数,但是没有成功。你知道如何做吗?

1个回答

23

让我们创建一些虚拟数据:

import datetime
from pyspark.sql import Row
from pyspark.sql.functions import col

row = Row("vacationdate")

df = sc.parallelize([
    row(datetime.date(2015, 10, 07)),
    row(datetime.date(1971, 01, 01))
]).toDF()

如果您使用的是Spark >= 1.5.0版本,您可以使用date_format函数:
from pyspark.sql.functions import date_format

(df
   .select(date_format(col("vacationdate"), "dd-MM-YYYY")
   .alias("date_string"))
   .show())

在 Spark < 1.5.0 中,可以使用 Hive UDF 来实现:
df.registerTempTable("df")
sqlContext.sql(
    "SELECT date_format(vacationdate, 'dd-MM-YYYY') AS date_string FROM df")

当然,在Spark >= 1.5.0中仍然可以使用它。

如果您不使用 HiveContext,则可以使用UDF模拟 date_format

from pyspark.sql.functions import udf, lit
my_date_format = udf(lambda d, fmt: d.strftime(fmt))

df.select(
    my_date_format(col("vacationdate"), lit("%d-%m-%Y")).alias("date_string")
).show()

请注意,它使用的是C标准格式而不是Java 简单日期格式

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接