【问题标题】:Loading plain text dates in Spark v3 from CSV从 CSV 在 Spark v3 中加载纯文本日期
【发布时间】:2021-09-02 21:24:16
【问题描述】:

我正在尝试在 Apache Spark 中提取带有日期的非常基本的 CSV 文件。复杂性在于被阐明的几个月。出于分析目的,我想将这些月份作为日期。这是我的 CSV 文件:

Period,Total
"January 2000","5394"
"February 2000","5249"
"March 2000","6447"
"April 2000","6062"
"May 2000","6342"
"June 2000","6914"

我尝试使用以下方法提取数据:

// Creates the schema
StructType schema = DataTypes.createStructType(new StructField[] {
    DataTypes.createStructField(
        "month",
        DataTypes.DateType,
        false),
    DataTypes.createStructField(
        "ct",
        DataTypes.IntegerType,
        true) });

// Reads a CSV file with header
Dataset<Row> df = spark.read().format("csv")
    .option("header", true)
    .option("dateFormat", "MMMM YYYY")
    .schema(schema)
    .load("my.csv");

Spark 不太喜欢我使用的dateFormat...并给了我:

org.apache.spark.SparkUpgradeException:由于 Spark 3.0 的升级,您可能会得到不同的结果:无法识别 DateTimeFormatter 中的 'YYYY' 模式。 1)您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY 以恢复 Spark 3.0 之前的行为。 2)您可以使用https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html的指南形成有效的日期时间模式

我试过LLLL YYYYM YMMMM Y...LLLL YYYY 没有崩溃但返回一个空字段。

我使用 Spark v3.1、Java v8。 Java 不是这里的问题;)。

【问题讨论】:

    标签: java csv apache-spark date data-ingestion


    【解决方案1】:

    大写字母Y 是周年模式,而不是年模式。您应该使用小写的y 字母作为模式。

    所以你的模式应该是MMMM yyyy 而不是MMMM YYYY

    Dataset<Row> df = spark.read().format("csv")
        .option("header", true)
        .option("dateFormat", "MMMM yyyy")
        .schema(schema)
        .load("my.csv");
    

    【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2021-11-12
    • 2023-03-15
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多