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

Posted

技术标签:

【中文标题】Pyspark 将列类型从日期更改为字符串【英文标题】:Pyspark changing type of column from date to string 【发布时间】:2015-10-06 18:45:06 【问题描述】:

我有以下数据框:

corr_temp_df
[('vacationdate', 'date'),
 ('valueE', 'string'),
 ('valueD', 'string'),
 ('valueC', 'string'),
 ('valueB', 'string'),
 ('valueA', 'string')]

现在我想将vacationdate 列的数据类型更改为String,以便数据框也采用这种新类型并覆盖所有条目的数据类型数据。例如。写完后:

corr_temp_df.dtypes

vacationdate 的数据类型应该被覆盖。

我已经使用过 cast、StringType 或 astype 等函数,但没有成功。你知道怎么做吗?

【问题讨论】:

【参考方案1】:

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

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

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 standard format 而不是Java simple date format

【讨论】:

以上是关于Pyspark 将列类型从日期更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将列类型从整数更改为字符串

Postgres 和 Laravel 如何将列从字符串类型更改为整数?

SQL Server 2012 如何将列的数据类型从位更改为日期字段?

Sequelize PostgreSQL:将列类型字符串更改为字符串数组

在 ROR 迁移期间将列类型从 Date 更改为 DateTime

postgreSQL 将列数据类型更改为没有时区的时间戳