使用Spark中的数据帧以微秒精度解析日期

时间:2019-06-18 16:29:19

标签: scala csv apache-spark dataframe time

我有一个csv文件:

Name;Date
A;2018-01-01 10:15:25.123456
B;2018-12-31 10:15:25.123456

我尝试使用Spark Dataframe进行解析:

val df = spark.read.format(source="csv")
    .option("header", true)
    .option("delimiter", ";")
    .option("inferSchema", true)
    .option("timestampFormat", "yyyy-MM-dd HH:mm:ss.SSSSSS")

但是生成的数据帧在毫秒被(错误地)截断了:

scala> df.show(truncate=false)
+---+-----------------------+
|Nom|Date                   |
+---+-----------------------+
|A  |2018-01-01 10:17:28.456|
|B  |2018-12-31 10:17:28.456|
+---+-----------------------+


df.first()(1).asInstanceOf[Timestamp].getNanos()
res51: Int = 456000000

奖金问题:读取精度为纳秒

1 个答案:

答案 0 :(得分:1)

.SSSSS表示毫秒而不是微秒: java.util.Date format SSSSSS: if not microseconds what are the last 3 digits?https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 因此,如果您需要微秒,则应通过自定义代码解析日期: Handling microseconds in Spark Scala

奖励答案:SparkSQL在内部以毫秒为单位存储数据,因此您可以使用字符串来存储nano或单独的字段或任何其他自定义解决方案