我见过(这里:如何将DataFrame中的时间戳转换为日期格式? https://stackoverflow.com/questions/40656001/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()
但这会在列中返回 nulldate_again
:
+--------+----------+----------+
| date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502229600| null|
|20171007|1507327200| null|
+--------+----------+----------+
知道什么地方失败了吗?
下列的:
func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
.otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd'))
不起作用,因为它的类型不一致 - 第一个子句返回string
而第二个子句返回bigint
。结果它总是会返回NULL
if data
is NOT 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")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)