在写入 Spark 数据帧时更改可空字段

Nar*_*esh 2 dataframe apache-spark apache-spark-sql

以下代码从 parquet 文件中读取 Spark DataFrame 并写入另一个 parquet 文件。将 DataFrame 写入新 Parquet 文件后,ArrayType DataType 中的 Nullable 字段发生更改。

代码:

    SparkConf sparkConf = new SparkConf();
    String master = "local[2]";
    sparkConf.setMaster(master);
    sparkConf.setAppName("Local Spark Test");
    JavaSparkContext sparkContext = new JavaSparkContext(new SparkContext(sparkConf));
    SQLContext sqc = new SQLContext(sparkContext);
    DataFrame dataFrame = sqc.read().parquet("src/test/resources/users.parquet");
    StructField[] fields = dataFrame.schema().fields();
    System.out.println(fields[2].dataType());
    dataFrame.write().mode(SaveMode.Overwrite).parquet("src/test/resources/users1.parquet");


    DataFrame dataFrame1 = sqc.read().parquet("src/test/resources/users1.parquet");
    StructField [] fields1 = dataFrame1.schema().fields();
    System.out.println(fields1[2].dataType());
Run Code Online (Sandbox Code Playgroud)

输出:

ArrayType(IntegerType,false)
ArrayType(IntegerType,true)
Run Code Online (Sandbox Code Playgroud)

Spark 版本为:1.6.2

小智 5

对于 Spark 2.4 或更早版本,从 spark sql 写入的所有列都可以为空。引用官方指南

Parquet 是一种列格式,许多其他数据处理系统都支持该格式。Spark SQL 支持读取和写入 Parquet 文件,自动保留原始数据的模式。写入 Parquet 文件时,出于兼容性原因,所有列都会自动转换为可为空。