如何将Timestamp转换为数据框中的日期格式?)转换数据类型中的时间戳的方法,但至少对我而言,它不起作用。 我尝试的是我尝试的东西:
# 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()
但是,此返回列中的null:
:
date_again
toplowing:
+--------+----------+----------+
| 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
而不是空的,它将始终返回
data
。它也已过时 - SQL函数是
NOT NULL
且格式畸形的。无需额外检查。
NULL
您不需要Spark 2.2或更高版本中的中间步骤:
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|
+--------------------------+
您应该做以下
from pyspark.sql.functions import to_date
to_date("date", "yyyyMMdd")
架构是
为Pyspark:库
您有一个字段名称:'dateTime'
添加了您的
DF的新字段,该字段显示了一个'dateonly'列,如下所示:
>>> 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)
this将在
中显示一个新列,称为dateonly-,日期为Yyyymmdd形式
在pyspark dataframe( from pyspark.sql.functions import date_format
df.withColumn("DateOnly", date_format('DateTime', "yyyyMMdd")).show()
)中转换一个列列(称为unix_timestamp
) - 到TIMESTMP
类型:
从Unix时间戳到
df
从
Date
转到
timestamp
timestamp
:Date
使用
df.printShchema()
以如下:-- TIMESTMP: long (nullable = true)
printschema()将显示:
spark.SQL
最终将类型从
df.registerTempTable("dfTbl")
dfNew= spark.sql("""
SELECT *, cast(TIMESTMP as Timestamp) as newTIMESTMP
FROM dfTbl d
""")
dfNew.printSchema()
转换为-- newTIMESTMP: timestamp (nullable = true)
如下:
timestamp
Date
他们关闭了我的问题,因为这是一个重复的,所以我会在这里复制并粘贴我的答案(是重复的,对吗?)
时间戳列仅以毫秒为单位,即可将其转换为秒并将其施加到
from pyspark.sql.types import DateType
dfNew=dfNew.withColumn('actual_date', dfNew['newTIMESTMP'].cast(DateType()))
#udf to convert the ts to timestamp
get_timestamp = udf(lambda x : datetime.datetime.fromtimestamp(x/ 1000.0).strftime("%Y-%m-%d %H:%M:%S"))
#apply this udf in the dataframe with your timestamp
df_withdate = df.withColumn("datetime", get_timestamp(df.ts))
没有TimestampType
的选择:
from pyspark.sql.types import TimestampType
import pyspark.sql.functions as F
df.select(
(F.col("my_timestamp") / 1000).cast(TimestampType())
)
您可以直接投放田野: