我有一个分区的hdfs parquet位置,其中不同的分区具有不同的模式。
比如第一个分区有5个列,第二个分区有4个列。现在我尝试读取基本的Parquet路径,然后过滤第二个分区。
这会给我一个DF中的5列,即使我在第二个分区的Parquet文件中只有4列。
当我直接读取第二个分区时,它会正确地给出4列。如何解决这个问题。
在读取parquet文件时,您可以指定所需的模式(4个列)
!
模式
中的字段,如果数据中不存在该字段,则将返回null
。示例:
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val sch=new StructType().add("i",IntegerType).add("z",StringType)
spark.read.schema(sch).parquet("<parquet_file_path>").show()
//here i have i in my data and not have z field
//+---+----+
//| i| z|
//+---+----+
//| 1|null|
//+---+----+
所以很有趣的是你使用的Spark版本以及如何设置属性spark.sql.parquet.mergeSchema
(Spark设置)和mergeSchema
(客户端)
mergeSchema
选项了吗? - maxgruber19
.schema(<new_schema>)
然后读取 Parquet 目录?如果我们不指定 .schema 选项,Parquet 将仅为指定的模式拉取数据,否则它将读取所有字段! - notNull