首页 > 解决方案 > databricks CSV导入时间戳NULL问题

问题描述

我正在尝试Databricks学习 Academy Spark SQL 课程,并且正在Databricks社区版中练习。有时,我需要从 CSV 创建一个表。这是 CSV 链接。

我正在尝试使用 UI 创建表。我正在检查“第一行是标题”和“推断架构”框。birthDate字段在预览窗格中显示为字符串。根据课程材料,它应该是时间戳。但是,如果我将字段类型更改为时间戳,则数据将加载空值。如果我将birthDate字段保持原样 ( String),则数据正在正确加载。

我该如何处理这个问题?

字段中的示例数据birthDate

1999-09-13T04:00:00.000+0000

标签: csvnulltimestampdatabricks

解决方案


inferSchema对于 CSV 文件,需要特定格式的数据: yyyy-MM-dd'T'HH:mm:ss.SSSXXX,并且该XXX模式与以下时区规范匹配: Z; -08; -0830; -08:30; -083015; -08:30:15;,这与您的数据不匹配。

要解决此问题,您可以恢复通过笔记本创建表,并添加以下选项以指定时间戳格式:.option("timestampFormat", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"),整个读取命令如下所示:

df = spark.read.format("csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .option("timestampFormat", "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    .load(path_to_file)

另一种可能性是加载数据,然后to_timestamp在必要的列上使用 - 它具有比 CSV 更好的自动检测功能infrerSchema

from pyspark.sql.functions import to_timestamp, col
df = spark.read.format("csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .load(path_to_file)
    .withColumn("birthDate", to_timestamp(col("birthDate")))

推荐阅读