我在这里看到:How to convert Timestamp to Date format in DataFrame?在datetype中转换时间戳的方式,但至少对我来说,它不起作用。
以下是我尝试的内容
# 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|
+--------+----------+----------+
知道什么是失败的?
答案 0 :(得分:10)
下列的程序:
func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
.otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd'))
不起作用,因为它的类型不一致 - 第一个子句返回string
,而第二个子句返回bigint
。因此,如果NULL
为data
并且不为空,则始终会返回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")
答案 1 :(得分:9)
你应该做以下
>>> 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)
答案 2 :(得分:4)
对于pyspark:
假设您有一个字段名称:'DateTime',它将日期显示为日期和时间
在 df 中添加一个新字段,其中显示'DateOnly'列,如下所示:
from pyspark.sql.functions import date_format
df.withColumn("DateOnly", date_format('DateTime', "yyyyMMdd")).show()
这将在 df 中显示名为 DateOnly 的新列 - 日期为 yyyymmdd 形式
答案 3 :(得分:1)
要将pyspark数据框(unix_timestamp
)中的TIMESTMP
列(称为df
)转换为Date
类型:
以下是两个步骤(可能有更短的方法):
timestamp
timestamp
转换为Date
最初df.printShchema()
显示:-- TIMESTMP: long (nullable = true)
使用spark.SQL
按如下方式实施转化:
df.registerTempTable("dfTbl")
dfNew= spark.sql("""
SELECT *, cast(TIMESTMP as Timestamp) as newTIMESTMP
FROM dfTbl d
""")
dfNew.printSchema()
printSchema()将显示:
-- newTIMESTMP: timestamp (nullable = true)
最后将类型从timestamp
转换为Date
,如下所示:
from pyspark.sql.types import DateType
dfNew=dfNew.withColumn('actual_date', dfNew['newTIMESTMP'].cast(DateType()))
答案 4 :(得分:1)
#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))
答案 5 :(得分:0)
他们关闭了我的 question 作为这个答案的副本,所以我将在这里复制并粘贴我的答案(是重复的,对吗?)
由于时间戳列以毫秒为单位,因此只需将其转换为秒并将其转换为 TimestampType
就可以了:
from pyspark.sql.types import TimestampType
import pyspark.sql.functions as F
df.select(
(F.col("my_timestamp") / 1000).cast(TimestampType())
)
答案 6 :(得分:0)
不带 import TimestampType
的选项:
import pyspark.sql.functions as F
F.from_unixtime(F.col('date_col') / 1000).cast('date')