使用Spark时,CSV内容被解析为null值。

4

我想要读取一个CSV文件,然后使用Spark SQL查询它。CSV文件长这样:

16;10;9/6/2018

CSV文件没有标题行,但我们知道第一列是部门代码,第二列是建筑物代码,第三列是格式为m/d/YYYY的日期。

我编写了以下代码来使用自定义模式加载CSV文件:

 StructType sch = DataTypes.createStructType(new StructField[] {
            DataTypes.createStructField("department",  DataTypes.IntegerType, true),
            DataTypes.createStructField("building", DataTypes.IntegerType, false),
            DataTypes.createStructField("date", DataTypes.DateType, true),


    });
    Dataset<Row> csvLoad = sparkSession.read().format("csv")
            .option("delimiter", ";")
            .schema(sch)
            .option("header","false")
            .load(somefilePath);
    csvLoad.show(2);

当我使用csvLoad.show(2)时,它只会显示如下输出:
|department|building|date|
+----------+---------+---+
|null      |null     |null |
|null      |null     |null |

请问有谁能告诉我这段代码有什么问题吗?我正在使用spark 2.4版本。


2
你的日期格式正确吗?Spark要求日期格式为“yyyy-mm-dd”,而你使用的格式是“dd/mm/yyyy”。 - Maxime Launois
@MaximeLaunois 是的。它不符合Spark所需的格式。在TheWhiteRabbit给出的答案的帮助下,我已经修复了这个问题。 - A Beginner
1个回答

3
问题出在您的日期字段上,由于其具有自定义格式,您需要将格式作为选项进行指定:
Dataset<Row> csvLoad = sparkSession.read().format("csv")
        .option("delimiter", ";")
        .schema(sch)
        .option("header","false")
        .option("dateFormat", "m/d/YYYY")
        .load(somefilePath);

这将导致输出结果:
+----------+--------+----------+
|department|building|      date|
+----------+--------+----------+
|        16|      10|2018-01-06|
+----------+--------+----------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接