以下代码从镶木地板文件中读取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
答案 0 :(得分:4)
对于Spark 2.4或之前,从spark sql编写的所有列都可以为空。引用the official guide
Parquet是一种柱状格式,许多其他数据处理系统都支持它。 Spark SQL支持读取和写入Parquet文件,这些文件自动保留原始数据的模式。在编写Parquet文件时,出于兼容性原因,所有列都会自动转换为可为空。