将时间戳转换为 Spark 数据框中的日期

新手上路,请多包涵

我已经看到(这里: How to convert Timestamp to Date format in DataFrame? )在日期类型中转换时间戳的方法,但是,至少对我来说,它不起作用。

这是我试过的:

 # Create dataframe
df_test = spark.createDataFrame([('20170809',), ('20171007',)], ['date',])

# Convert to timestamp
df_test2 = df_test.withColumn('timestamp',func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
.otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd')))\

# Convert timestamp to date again
df_test2.withColumn('date_again', df_test2['timestamp'].cast(stypes.DateType())).show()

但这在列 date_again 中返回 null :

 +--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502229600|      null|
|20171007|1507327200|      null|
+--------+----------+----------+

知道什么失败了吗?

原文由 Luis A.G. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 841
2 个回答

下列的:

 func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
  .otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd'))

不起作用,因为它类型不一致 - 第一个子句返回 string 而第二个子句返回 bigint 。因此,它将始终返回 NULL 如果 dataNOT NULL 并且不为空。

它也已过时 - SQL 函数是 NULL 并且格式错误是安全的。无需额外检查。

 In [1]: spark.sql("SELECT unix_timestamp(NULL, 'yyyyMMdd')").show()
+----------------------------------------------+
|unix_timestamp(CAST(NULL AS STRING), yyyyMMdd)|
+----------------------------------------------+
|                                          null|
+----------------------------------------------+

In [2]: spark.sql("SELECT unix_timestamp('', 'yyyyMMdd')").show()
+--------------------------+
|unix_timestamp(, yyyyMMdd)|
+--------------------------+
|                      null|
+--------------------------+

在 Spark 2.2 或更高版本中你不需要中间步骤:

 from pyspark.sql.functions import to_date

to_date("date", "yyyyMMdd")

原文由 Alper t. Turker 发布,翻译遵循 CC BY-SA 3.0 许可协议

你应该做以下事情

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).show()
+--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502216100|2017-08-09|
|20171007|1507313700|2017-10-07|
+--------+----------+----------+

模式是

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).printSchema()
root
 |-- date: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- date_again: date (nullable = true)

原文由 Ramesh Maharjan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题