在Spark DataFrame

问题描述 投票:0回答:7
我已经看到了(这里:

如何将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| +--------+----------+----------+
apache-spark date pyspark apache-spark-sql timestamp
7个回答
26
投票
因为它的类型不一致而行不通 - 第一个子句返回

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")

架构是

18
投票

为Pyspark:

您有一个字段名称:
'dateTime'

8
投票

添加了您的

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将在

DF

中显示一个新列,称为dateonly-,日期为Yyyymmdd形式


在pyspark dataframe( from pyspark.sql.functions import date_format df.withColumn("DateOnly", date_format('DateTime', "yyyyMMdd")).show() )中转换一个列列(称为unix_timestamp) - 到TIMESTMP类型:


3
投票

从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()))

2
投票
#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))

1
投票

没有TimestampType的选择:

from pyspark.sql.types import TimestampType import pyspark.sql.functions as F df.select( (F.col("my_timestamp") / 1000).cast(TimestampType()) )

    

您可以直接投放田野:

1
投票


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.