问题解决: Spark无法读取有多个子目录的Parquet表
a_void 2019-12-13 16:01:52 338 收藏 分类专栏: 数据仓库 文章标签: spark 版权 问题解决: 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一次。
参考文档: grokbase.com/t/hive/user… 在这里插入图片描述
配置spark使用hive的数据解析方法 增加如下的配置,第一行是配置hive支持子目录,第二行是配置sql不使用spark自带的文件解析方式而使用hive的。
sqlContext.setConf("mapred.input.dir.recursive","true"); sqlContext.setConf("spark.sql.hive.convertMetastoreParquet", "false"); 1 2 参考文档: apache-spark-user-list.1001560.n3.nabble.com/Spark-SQL-H… 在这里插入图片描述