【问题标题】:Issue with date and inferSchema option in spark 3.1spark 3.1 中的 date 和 inferSchema 选项问题
【发布时间】:2022-01-23 14:49:46
【问题描述】:

我有一个包含如下所示日期列的 CSV 文件,

datecol
----------
2021-01-11
2021-02-15
2021-02-10
2021-04-22

如果我通过在 spark 版本 2.4.5 中启用 inferSchema 来读取此文件,我将低于架构,

root
 |-- datecol: timestamp (nullable = true)

但在下面的 spark 3.1 中是输出。

root
 |-- datecol: string (nullable = true)

我从 spark 文档中检查了migration guide,但没有得到任何相关信息。

谁能确认这是一个错误还是我需要使用其他一些配置?

【问题讨论】:

    标签: scala apache-spark pyspark apache-spark-sql


    【解决方案1】:

    这是自 Spark 3+ 以来 Spark 迁移到 Java 8 新 Date API 的效果。您可以阅读migration guide

    时间戳/日期字符串的解析/格式化。这对 CSV/JSON 的影响 数据源 [...]。新实现对其输入进行严格检查。例如, 如果模式是,则无法解析 2015-07-22 10:00:00 时间戳 yyyy-MM-dd 因为解析器不会消耗整个输入。其他 例如31/01/2015 00:00 输入不能被 dd/MM/yyyy hh:mm 模式,因为 hh 假设小时在 1-12 范围内。 在 Spark 2.4 及以下版本中,java.text.SimpleDateFormat 用于 时间戳/日期字符串转换 [...]。

    事实上,inferSchema 不会检测到DateType,而只会检测到TimestampType。并且由于在CSV Data Source 中默认情况下,参数timestampFormatyyyy-MM-dd'T'HH:mm:ss[.SSS][XXX],因此由于上述原因,它不会转换为时间戳。

    您可以尝试在加载csv时添加选项:

    val df = spark.read.option("inferSchema", "true").option("timestampFormat", "yyyy-MM-dd").csv("/path/csv")
    

    【讨论】:

    • 感谢您的回答。我尝试使用选项timestampFormat,但它仅将类型推断为字符串。
    • @MohanaBC 您是否在选项中指定了inferSchema = true?我可以使用上面的代码将列推断为时间戳。
    • 哦!我错过了。添加inferSchema! 后它正在工作。谢谢。
    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多