CSV内容被Spark读取为null

时间:2019-06-04 07:29:01

标签: java apache-spark

我正在尝试读取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版本。

1 个答案:

答案 0 :(得分:2)

问题出在您的date字段上,因为它具有自定义格式,因此您需要将格式指定为选项:

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|
+----------+--------+----------+