Spark是否支持使用Parquet文件进行分区修剪

Eua*_*uan 18 hive amazon-s3 apache-spark parquet

我正在使用一个大型数据集,该数据集由两列分隔 - plant_nametag_id.第二个分区 - tag_id有200000个唯一值,我主要通过特定tag_id值访问数据.如果我使用以下Spark命令:

sqlContext.setConf("spark.sql.hive.metastorePartitionPruning", "true")
sqlContext.setConf("spark.sql.parquet.filterPushdown", "true")
val df = sqlContext.sql("select * from tag_data where plant_name='PLANT01' and tag_id='1000'")
Run Code Online (Sandbox Code Playgroud)

我希望快速响应,因为这解析为单个分区.在Hive和Presto中,这需要几秒钟,但在Spark中运行数小时.

实际数据保存在S3存储桶中,当我提交sql查询时,Spark关闭并首先获取Hive Metastore中的所有分区(其中200000个),然后调用refresh()强制所有这些文件的完整状态列表在S3对象库中(实际调用listLeafFilesInParallel).

这两个操作是如此昂贵,是否有任何设置可以让Spark更早地修剪分区 - 在调用元数据存储期间,还是之后立即?

Mar*_*o99 1

只是一个想法:

HadoopFsRelation 的 Spark API 文档说,( https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/sources/HadoopFsRelation.html )

“...从文件系统中存储的 Hive 样式分区表读取时,它能够从输入目录的路径中发现分区信息,并在开始读取数据之前执行分区修剪...”

所以,我想“listLeafFilesInParallel”不可能是问题。

Spark jira 中已经存在类似的问题:https ://issues.apache.org/jira/browse/SPARK-10673

尽管“spark.sql.hive.verifyPartitionPath”设置为 false 并且对性能没有影响,但我怀疑该问题可能是由未注册的分区引起的。请列出表的分区并验证是否所有分区都已注册。否则,恢复您的分区,如以下链接所示:

Hive 不读取 Spark 生成的分区 parquet 文件

更新:

  1. 我猜想在写入数据时设置了适当的镶木地板块大小和页面大小。

  2. 创建一个新的配置单元表,其中包含提到的分区,文件格式为镶木地板,使用动态分区方法从非分区表加载它。( https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions ) 运行普通的 hive 查询,然后通过运行 Spark 程序进行比较。

免责声明:我不是火花/镶木地板专家。这个问题听起来很有趣,因此做出了回应。