【问题标题】:spark.sql str_to_date alternativespark.sql str_to_date 替代
【发布时间】: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


【解决方案1】:

以下仅适用于 'YYYY-mm-dd' 格式,但不适用于 dd/mm/YYYY 等其他格式

 res = spark.sql("SELECT name, enroll_DATE, TO_DATE(CAST(enroll_DATE AS TIMESTAMP)) AS newdate from data")
>>> res.show()
+----+-----------+----------+
|name|enroll_DATE|   newdate|
+----+-----------+----------+
|   a| 2018-01-20|2018-01-20|
|   b| 2018-01-21|2018-01-21|
|   c| 2018-01-22|2018-01-22|
+----+-----------+----------+

>>> res.printSchema()
root
|-- name: string (nullable = true)
|-- enroll_DATE: string (nullable = true)
|-- newdate: date (nullable = true)

【讨论】:

    【解决方案2】:
    spark.sql("SELECT name, enroll_date, TO_DATE(CAST(UNIX_TIMESTAMP(enroll_date, 'y-M-d') AS TIMESTAMP)) AS newdate from data")
    

    unix_timestamp in spark

    Pattern for unix_timestamp

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2019-01-19
      • 1970-01-01
      • 2020-01-03
      • 2019-07-18
      • 1970-01-01
      • 2022-06-27
      • 2013-07-19
      • 2019-09-19
      相关资源
      最近更新 更多