【发布时间】:2018-07-02 08:07:21
【问题描述】:
我正在尝试将具有某种格式(YYYY-mm-dd)的日期的字符串列转换为日期/时间戳列。但不能通过使用sql的str_to_date函数来做到这一点。
我已关注此Convert date from String to Date format in Dataframes,但它适用于单个值,而不是我希望将日期时间戳转换应用于列的所有行,所以我尝试了以下
sparkDF = spark.createDataFrame([('a', '2018-01-20'), ('b', '2018-01-21'), ('c', '2018-01-22')], ['name','enroll_DATE'])
>>> sparkDF.show()
+----+-----------+
|name|enroll_DATE|
+----+-----------+
| a| 2018-01-20|
| b| 2018-01-21|
| c| 2018-01-22|
+----+-----------+
>>> sparkDF.printSchema()
root
|-- name: string (nullable = true)
|-- enroll_DATE: string (nullable = true)
sparkDF.registerTempTable('data')
res = spark.sql("select name, enroll_DATE, TO_DATE(CAST(UNIX_TIMESTAMP(enroll_DATE, '%Y-%m-%d') as TIMESTAMP)) as converted_ED from data ")
但将 convert_ED 列的所有值都设为 null。
显然有更好的方法来处理 DataFrame 操作,但我有限制(或你可以说的约束)在 sparkDataframe 转换方式中执行此操作。基本上 spark.sql 对我来说是强制性的。
根据链接,如果可以对单个 date_string 值执行相同操作,那么可能已经存在(我不知道)对列执行相同操作的方法。
请提出建议。谢谢。
编辑
通过将格式字符串从 '%Y-%m-%d' 更改为 'YYYY-mm-dd',转换成功,但方式很奇怪(两个日期不同!!!!)
res = spark.sql("SELECT name, enroll_DATE, TO_DATE(CAST(UNIX_TIMESTAMP(enroll_DATE, 'YYYY-mm-dd') AS TIMESTAMP)) AS newdate from data")
>>> res.show()
+----+-----------+----------+
|name|enroll_DATE| newdate|
+----+-----------+----------+
| a| 2018-01-20|2017-12-31| ### two dates are different
| b| 2018-01-21|2017-12-31|
| c| 2018-01-22|2017-12-31|
+----+-----------+----------+
>>> res.printSchema()
root
|-- name: string (nullable = true)
|-- enroll_DATE: string (nullable = true)
|-- newdate: date (nullable = true)
但是仍然在寻找对 '%Y-%d-%m' 格式做同样的事情(如果有任何解决方案的话。)。
【问题讨论】:
-
能否分享一下您的enroll_DATE 列示例数据的格式对您有很大帮助
-
你能给你看数据吗?如果您的字符串是 YYYY-MM-DD,您可以直接将其转换为技术上的日期
-
格式为 '%Y-%m-%d' 或 YYYY-mm-dd 例如:2018-01-22。我已经提到了 spark.sql 查询中的格式。为了更清楚,也添加了一些样本。谢谢。
-
@Steven:正如我所提到的,有一个约束(来自设计流程),我不能在 enroll_DATE 列上使用 sparkDF 转换将其转换为我的代码中的时间戳类型,该列必须在里面spark.sql 查询表达式。
标签: pyspark apache-spark-sql pyspark-sql