在编写Spark Dataframe时可以更改Nullable字段

时间:2016-09-26 07:41:06

标签: apache-spark dataframe apache-spark-sql spark-dataframe spark-java

以下代码从镶木地板文件中读取Spark DataFrame并写入另一个镶木地板文件。在将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());

输出: 数组类型(IntegerType,FALSE) 数组类型(IntegerType,真)

Spark版本是:1.6.2

1 个答案:

答案 0 :(得分:4)

对于Spark 2.4或之前,从spark sql编写的所有列都可以为空。引用the official guide

  

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