我与大型数据集工作,由两列分区。第二个分区 - 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'")
我希望快速响应,因为这解决了一个单一的分区。在Hive和Presto中这需要几秒钟,但是在Spark中它会运行数小时。
实际数据保存在S3存储桶中,并且当我提交sql查询时,Spark将关闭并首先从Hive Metastore(其中的200000个)获取所有分区,然后调用refresh()
以强制完整状态S3对象存储中所有这些文件的列表(实际调用listLeafFilesInParallel
)。
正是这两种操作是如此昂贵,是否有可以得到星火的分区修剪前面任何设置 - 要么调用元数据存储,或随即期间?
我也试图与附加配置参数上面的代码: 'sqlContext.setConf(“spark.sql.hive.verifyPartitionPath”,“假”)' 对性能没有影响 – Euan
这是一个有趣问题,但很难回答,因为你没有描述如何创建'tag_data'的DataFrame。我认为延长这个问题是一个好主意,以便它可以自己重现。 –
如果我更了解Hive和Parquet,可能我会。实际上,我不知道如何创建(双重)分区的Parquet文件。而且我不清楚你是直接使用Parquet文件,还是在某种程度上涉及Hive。 (Hive被多次提及,但如果这只是一个Parquet文件,我不知道它扮演了什么角色。) –