spark中的to_timestamp()函数给出空值
Posted
技术标签:
【中文标题】spark中的to_timestamp()函数给出空值【英文标题】:to_timestamp() function in spark is giving null values 【发布时间】:2019-03-28 12:25:48 【问题描述】:所以我读了一个带有架构的 csv 文件:
mySchema = StructType([StructField("StartTime", StringType(), True),
StructField("EndTime", StringType(), True)])
data = spark.read.load('/mnt/Experiments/Bilal/myData.csv', format='csv', header='false', schema = mySchema)
data.show(truncate = False)
我明白了:
+---------------------------+---------------------------+
|StartTime |EndTime |
+---------------------------+---------------------------+
|2018-12-24T03:03:31.8088926|2018-12-24T03:07:35.2802489|
|2018-12-24T03:13:25.7756662|2018-12-24T03:18:10.1018656|
|2018-12-24T03:23:32.9391784|2018-12-24T03:27:57.2195314|
|2018-12-24T03:33:31.0793551|2018-12-24T03:37:04.6395942|
|2018-12-24T03:43:54.1638926|2018-12-24T03:46:38.1188857|
+---------------------------+---------------------------+
现在,当我使用以下方法将这些列从字符串类型转换为时间戳类型时:
data = data.withColumn('StartTime', to_timestamp('StartTime', "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"))
data = data.withColumn('EndTime', to_timestamp('EndTime', "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"))
我得到空值:
+---------+-------+
|StartTime|EndTime|
+---------+-------+
|null |null |
|null |null |
|null |null |
|null |null |
|null |null |
+---------+-------+
【问题讨论】:
请通过以上链接进行必要的修改。enter link description here @Prathik,感谢您的回复。我已经能够使用 to_timestamp() 将字符串解析为时间戳。但我希望精度达到纳秒,类似于我展示的字符串。 这个问题有一张 JIRA 票。它指出该票已解决,但不确定为什么它仍然无法正常工作。 issues.apache.org/jira/browse/SPARK-17914 @Gladiator,我真的想要包含毫秒和纳秒部分的时间戳列。有什么线索或想法吗? 您的用例是什么?我认为,如果你只是排序,你仍然可以将它作为一个字符串,它会一样工作 【参考方案1】:我能够通过投射来解决它。奇怪的是它不需要格式。 (Spark 2.4.0。Windows 10 上的本地模式) 投射前的架构。
df.printSchema()
root
|-- StartTime: string (nullable = true)
|-- EndTime: string (nullable = true)
from pyspark.sql import functions as F
df2 = df.withColumn('StartTime', F.col('StartTime').cast("timestamp")) \
.withColumn('EndTime', F.col('EndTime').cast("timestamp"))
结果
df2.show(truncate=False)
+--------------------------+--------------------------+
|StartTime |EndTime |
+--------------------------+--------------------------+
|2018-12-24 03:03:31.808892|2018-12-24 03:07:35.280248|
|2018-12-24 03:13:25.775666|2018-12-24 03:18:10.101865|
|2018-12-24 03:23:32.939178|2018-12-24 03:27:57.219531|
|2018-12-24 03:33:31.079355|2018-12-24 03:37:04.639594|
|2018-12-24 03:43:54.163892|2018-12-24 03:46:38.118885|
+--------------------------+--------------------------+
检查架构
df2.printSchema()
root
|-- StartTime: timestamp (nullable = true)
|-- EndTime: timestamp (nullable = true)
【讨论】:
以上是关于spark中的to_timestamp()函数给出空值的主要内容,如果未能解决你的问题,请参考以下文章
Postgres to_timestamp 将时区设置为 +1
如何在 oracle 中的 to_timestamp() 中传递字符串变量
如何将数组传递给 Spark (UDAF) 中的用户定义聚合函数
Aginity Workbench for Redshift - to_timestamp 转换问题