【问题标题】:Is there any way to handle time in pyspark?有什么方法可以处理pyspark中的时间吗?
【发布时间】:2020-07-08 13:03:25
【问题描述】:

我有一个包含 6 个字符的字符串,应该作为 TIME 数据类型加载到 SQL Server 中。 但是 spark 没有任何时间数据类型。我尝试了几种方法,但时间戳中没有返回数据类型。

我正在将数据作为字符串读取并将其转换为时间戳,然后最终尝试提取时间值,但它再次将值作为字符串返回。

df.select('time_col').withColumn("time_col",to_timestamp(col("time_col"),"HHmmss").cast(TimestampType())).withColumn("tim2", date_format(col("time_col"), "HHmmss")).printSchema()

root
|-- time_col: timestamp (nullable = true)
|-- tim2: string (nullable = true)

数据看起来像这样,但数据类型不同。

df.select('time_col').withColumn("time_col",to_timestamp(col("time_col"),"HHmmss").cast(TimestampType())).withColumn("tim2", date_format(col("time_col"), "HHmmss")).show(5)

+-------------------+------+
|           time_col|  tim2|
+-------------------+------+
|1970-01-01 14:44:51|144451|
|1970-01-01 14:48:37|144837|
|1970-01-01 14:46:10|144610|
|1970-01-01 11:46:39|114639|
|1970-01-01 17:44:33|174433|
+-------------------+------+

有什么方法可以在时间戳列或与 SQL Server 的 TIME 数据类型等效的列中获取 tim2 列?

【问题讨论】:

    标签: apache-spark pyspark databricks


    【解决方案1】:

    我认为你不会得到你想要做的事情,PySpark 中没有类型来处理“HH:mm:ss”,请参阅:What data type should be used for a time column

    我建议你用它作为字符串。

    【讨论】:

    • 我可以使用字符串,但目标是 SQL Server 中的 TIME,它对 spark 有什么期望?或者什么相当于火花中的时间?
    • 或者您可以在 SQL Server 上创建一个类型为 varchar 的列,然后将字符串 (varchar) 转换为时间类似于 SELECT CONVERT( TIME, '10:00:22' );
    • 好吧,我会试一试。非常感谢!
    【解决方案2】:

    在我的情况下,我曾经在 spark 中转换为时间戳,然后在发送到 SQL 服务器之前将其设为字符串。它对我来说很好。

    【讨论】:

    • Convert into timestamp 是指将原始字符串转换为 Timestamp 并在将数据推送到 SQL 之前转换为字符串?
    • 在我的情况下,我只有时间,但是当我投射到时间戳时,日期被附加到我的时间值上,这不是我想要的。我们可以尝试其他方法吗?
    【解决方案3】:

    也许这会对你有所帮助,但在我看来这会改变 str 中的列

    df.withColumn('TIME', date_format('datetime', 'HH:mm:ss'))
    

    【讨论】:

      【解决方案4】:

      在 scala 中,python 会类似:

      scala> val df = Seq("144451","144837").toDF("c").select('c.cast("INT").cast("TIMESTAMP"))
      df: org.apache.spark.sql.DataFrame = [c: timestamp]
      
      scala> df.show()
      +-------------------+
      |                  c|
      +-------------------+
      |1970-01-02 17:07:31|
      |1970-01-02 17:13:57|
      +-------------------+
      
      
      scala> df.printSchema()
      root
       |-- c: timestamp (nullable = true)
      

      【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2020-12-10
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多