Date _unixtime(unix_timestamp)中的Pyspark不转换为时间戳

Date _unixtime(unix_timestamp)中的Pyspark不转换为时间戳,date,pyspark,Date,Pyspark,我将Pyspark与Python 2.7一起使用。我有一个字符串中的日期列(带ms),希望转换为时间戳 这就是我迄今为止所尝试的 df=df.withColumn('end_time',from_unixtime(unix_时间戳(df.end_time,%Y-%M-%d%H:%M:%S.%f))) printSchema()显示 end\u时间:字符串(nullable=true) 当我将时间戳扩展为变量类型时,请尝试使用: 从pyspark.sql.functions从utc时间戳导入

我将Pyspark与Python 2.7一起使用。我有一个字符串中的日期列(带ms),希望转换为时间戳

这就是我迄今为止所尝试的

df=df.withColumn('end_time',from_unixtime(unix_时间戳(df.end_time,%Y-%M-%d%H:%M:%S.%f)))
printSchema()
显示
end\u时间:字符串(nullable=true)

当我将时间戳扩展为变量类型时,请尝试使用:

从pyspark.sql.functions从utc时间戳导入
df=df.withColumn('end_time',from_utc_timestamp(df.end_time,'PST'))
您需要为函数指定时区,在本例中,我选择了
PST

如果这不起作用,请给我们举几个行的例子,显示
df.end\u time

以下内容可能会有所帮助:-

from pyspark.sql import functions as F
df = df.withColumn("end_time", F.from_unixtime(F.col("end_time"), 'yyyy-MM-dd HH:mm:ss.SS').cast("timestamp"))

[更新]

创建一个时间戳格式为字符串的示例数据帧:

导入pyspark.sql.F函数
df=spark.createDataFrame([('2018年7月22日04:21:18.792 UTC',),('2018年7月23日04:21:25.888 UTC',),['TIME']))
测向显示(2,假)
df.printSchema()
输出:

+----------------------------+
|TIME                        |
+----------------------------+
|22-Jul-2018 04:21:18.792 UTC|
|23-Jul-2018 04:21:25.888 UTC|
+----------------------------+
root
|-- TIME: string (nullable = true)
字符串时间格式(包括毫秒)转换为unix\u时间戳(双精度)由于unix\u timestamp()函数不包括毫秒,我们需要使用另一个简单的hack将其添加到毫秒中。使用子字符串方法(start\u position=-7,length\u of\u substring=3)从字符串中提取毫秒,然后分别向unix\u timestamp添加毫秒。(强制转换到子字符串以浮动以进行添加)

df1=df.withColumn(“unix_timestamp”,F.unix_timestamp(df.TIME,'dd-MMM-yyyy HH:mm:ss.SSS z')+F.substring(df.TIME,-7,3).cast('float')/1000)
在Spark中将unix时间戳(双精度)转换为时间戳数据类型

df2=df1.withColumn(“TimestampType”,F.to_timestamp(df1[“unix_timestamp”]))
df2.show(n=2,truncate=False)
这将为您提供以下输出

+----------------------------+----------------+-----------------------+
|TIME                        |unix_timestamp  |TimestampType          |
+----------------------------+----------------+-----------------------+
|22-Jul-2018 04:21:18.792 UTC|1.532233278792E9|2018-07-22 04:21:18.792|
|23-Jul-2018 04:21:25.888 UTC|1.532319685888E9|2018-07-23 04:21:25.888|
+----------------------------+----------------+-----------------------+
检查架构:

df2.printSchema()


root
 |-- TIME: string (nullable = true)
 |-- unix_timestamp: double (nullable = true)
 |-- TimestampType: timestamp (nullable = true)

在当前版本的spark中,我们不必在时间戳转换方面做太多工作

在这种情况下,使用to_timestamp函数可以很好地工作。我们唯一需要注意的是根据原始列输入时间戳的格式。 在我的例子中,它的格式是yyyy-MM-dd HH:MM:ss。 其他格式可以是MM/dd/yyyy HH:MM:ss或其组合

from pyspark.sql.functions import to_timestamp
df=df.withColumn('date_time',to_timestamp('event_time','yyyy-MM-dd HH:mm:ss'))
df.show()

请包括一个带有一些小样本输入和所需输出的示例<代码>函数列未定义。
df=SparkSQLContext.createDataFrame([((“2018-02-11 04:21:25.12”),((“2018-02-12 04:22:26.13”),[“end_time”])
在此数据帧上不起作用,在end_time列中给出空值谢谢,这起作用了,还保留了毫秒!嗨,Tanjin,我遇到了同样的问题。我尝试了你的方法,它通过了,我得到了一个时间戳格式的新列“start_date”,但是所有的值都是空的。你能帮我看看吗?df1=df1.withColumn('start_date',f.from_utc_timestamp(df1.start_time,'PST'))df1.printSchema()df1.Selection('start_time','start_date')。show(5)root |--start_time:string(null=true)|--start_date:timestamp(null=true)+-----------------+-----------------+--------------开始时间|开始日期|+-------------------+-------------+----1597670747141 |空| 1597664804901 |空|