databrick CSV导入时间戳NULL问题

时间:2020-06-28 13:10:07

标签: csv null timestamp databricks

我正在尝试遵循Databricks Academy Spark SQL课程,并且正在Databricks社区版中进行练习。在某个时候,我需要从CSV创建一个表。 This is CSV link.

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

如何处理此问题?

birthDate字段中采样数据:

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

1 个答案:

答案 0 :(得分:1)

CSV文件expects data in the specific formatinferSchema

yyyy-MM-dd'T'HH:mm:ss.SSSXXX,并且XXX模式与following specification of the timezoneZ; -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")))