从 CSV 加载 Spark v3 中的纯文本日期

Loading plain text dates in Spark v3 from CSV

我正在尝试在 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 升级后可能会得到不同的结果: Fail to recognize 'YYYY' pattern in the DateTimeFormatter. 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 没有崩溃但是 returns 一个空字段。

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

大写字母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");