在spark 3.0中将stringtype转换为timestamptype

ozxc1zmp  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(452)

我一直在使用PySpark3.0。我有一个stringtype中带有“time”列的Dataframe。我想把它转换成时间戳。Dataframe如下所示。

+---------------+
|           time|
+---------------+
|10:59:46.000 AM|
| 6:26:36.000 PM|
|11:13:38.000 PM|
+---------------+

我尝试了\u timestamp()和unix \u timestamp。

df.withColumn("new_time", F.to_timestamp(col("time"),"hh:mm:ss.SSS a")).show()

.

df.withColumn('new_time', F.unix_timestamp(inputDF['time'], 'hh:mm:ss.SSS a').cast(TimestampType())).show()

我得到的错误是这个。

org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: Fail to parse '6:26:36.000 PM' in the new parser. You can set spark.sql.legacy.timeParserPolicy to LEGACY to restore the behavior before Spark 3.0, or set to CORRECTED and treat it as an invalid datetime string.

我想知道spark 3.0在没有设置的情况下是如何做到的

spark.conf.set("spark.sql.legacy.timeParserPolicy","LEGACY")

任何帮助都将不胜感激。谢谢。

h22fl7wq

h22fl7wq1#

不需要填充。。
您需要更改转换字符串的格式。。从中删除“h”,然后就可以了。

df.withColumn('new_time', f.unix_timestamp(df['Timestamp'], 'h:mm:ss.SSS a'))

格式说明:

'hh:mm:ss.SSS a'
01:00:00.000 pm
11:00:00.000 am

'h:mm:ss.SSS a'
1:00:00.000 pm
11:00:00.000 am
ryevplcw

ryevplcw2#

试试这个-

df.withColumn("new_time", F.to_timestamp(F.lpad(col("time"), 15, "0"),"hh:mm:ss.SSS a")).show()

some Explanation 1. lpad(column, length, "<string_to_be_padded>")- 此函数检查 length 并将左填充 string_to_be_padded 如果字符串长度<指定长度。 Example 输入行 6:26:36.000 PM 只有14个字符,由于指定的长度为 15 它会留下垫子 0 (第三个参数)使其长度为15。现在o/pod lpad是 06:26:36.000 PM . 这符合中指定的格式 to_timestamp 这里有更多的解释

相关问题