问题解决: Spark无法读取有多个子目录的Parquet表
用tez做数据处理时,免不了要用union all来整合多个数据源的数据。但是如果最后一步是union all
的话,就会生成多个子目录,这时用Spark就可能无法读取到子目录中的内容(取决于spark的配置)。
这个问题的原因是tez的union all
是并行去做的,为了避免文件的冲突,tez写到了多个子目录里面。解决这个问题有两个方向,一个是不生成子目录,一个是修改spark的配置。
不生成子目录, 只要最后一步不是union all就好了
1、再sql最后面增加distribute by
, 强制触发一次reduce过程
2、union all
插表结束之后,再做一次自表插入(insert overwrite self select from self
)
3、不用union all
,而是insert overwrite
一次,然后insert
一次。