Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Pyspark将字符串转换为UTC时间戳[获取空值]_Apache Spark_Pyspark_Timestamp_Unix Timestamp - Fatal编程技术网

Apache spark Pyspark将字符串转换为UTC时间戳[获取空值]

Apache spark Pyspark将字符串转换为UTC时间戳[获取空值],apache-spark,pyspark,timestamp,unix-timestamp,Apache Spark,Pyspark,Timestamp,Unix Timestamp,我是pyspark和Spark SQL的新手。我有一个数据框,其中一列的日期时间值为字符串,我需要将其转换/转换为时间戳 数据帧格式: +--------------------+------------------------------+ | value| time_from_text| +--------------------+------------------------------+ |dummy

我是pyspark和Spark SQL的新手。我有一个数据框,其中一列的日期时间值为字符串,我需要将其转换/转换为时间戳

数据帧格式:

+--------------------+------------------------------+
|               value|                time_from_text|
+--------------------+------------------------------+
|dummy               |2020-04-19T23:49:52.020000453Z|
|dummy               |2020-04-22T23:52:52.020000453Z|
+--------------------+------------------------------+
现在,我查看并尝试了以下代码片段:

result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'").cast(TimestampType()))
result = result.withColumn("time_from_text", substring(col("time_from_text"),0,19))
final_result = result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss").cast(TimestampType())).orderBy("Timestamp")
在我之前的案例中,我的spark版本是3.1.1,这确实有效。但是,我需要切换回2.4.6,在这里,相同的代码将null作为时间戳的输出

我尝试了许多不同的方法,但无法投射时间戳


任何指点都将不胜感激。谢谢你的帮助

这不是一个完美的答案,但我找到了一个快速解决方法来完成转换。 不知何故,格式“yyyy-MM-dd'T'HH:MM:ss”确实发生了转换。因此,我截短了time_from_text列,以降低亚秒精度[对于这里的用例来说这很好],然后进行了时间戳的转换

代码段:

result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'").cast(TimestampType()))
result = result.withColumn("time_from_text", substring(col("time_from_text"),0,19))
final_result = result.withColumn("Timestamp",unix_timestamp("time_from_text", "yyyy-MM-dd'T'HH:mm:ss").cast(TimestampType())).orderBy("Timestamp")
原因:

我做了一些研究,我最好的猜测是,在从Spark SQL 3.0升级到3.1的过程中,unix_时间戳代码库做了一些更改。因此,新版本支持格式“2020-04-19T23:49:52.0200000453Z”,但旧版本不支持格式“2020-04-19T23:49:52.0200000453Z”,旧版本通过引擎盖下实现。此外,旧版本导致无效日期时间模式为null,而新版本将直接失败

来源:

良好的调查:)我将代码链接留在这里,仅供参考2.4.6:3.1.1: