出现这个问题是因为在parquet数据中,有的column数据类型不一致。
发现这个问题是在load data的时候。如果 load 的数据是多路径的,有两种方式可以完成:
方式一:
val df = (0 util ndays).map{ i=>
path = $"{prefix_path}_{i}"
val tmpdf = spark.read.parquet(path)
tmpdf
}.reduce(_union_)
方式二:
val paths = (0 util ndays).map{i=>
$"{prefix_path}_{i}"
}
val df = spark.read.parquet(paths:_*)
相对来说,方式二是官方推荐的方式,加载的时候占用的内存更少一些,方式一会在每次load的时候都把路径下的data都遍历。
然后提到这里出现的bug,是因为有一列的数据类型不一样,一个是integer,一个是long。使用方式一并不会出现,因为reduce的时候会自动做类型转换(如果可以转的话),所以最后这列的type就是long。但是方式二是用一个schema去load数据的,所以就出现了这个类型不一致的错误。