我发现使用sparksql(来自pyspark)来查询从多个Parquet文件生成的Dataframe的效率远远低于从单个Parquet文件生成的相同数量的数据,尽管过滤条件不是第一列(因此我猜它不是索引内容)。有人知道为什么会这样吗?我怎样才能使查询响应时间和后者一样高效呢?
# the parquet files are stored on hdfs
hdfs_path = 'hdfs://localhost:9000/Test/'
paths = [hdfs_path+'p1.parquet', hdfs_path+'p2.parquet', hdfs_path+'p3.parquet']
# laod the parquet files into a DataFrame
dfs = sqlContext.read.parquet(*paths)
# query from the DataFrame
sql = '_c2 > 4 and _c2 < 10'
query_result = dfs.filter(sql).collect() # slower
# now write the DataFrame as 1 parquet and reload
dfs.write.mode('overwrite').parquet(hdfs_path+'all_in_one.parquet')
df = sqlContext.read.parquet(hdfs_path+'all_in_one.parquet')
# the query response time is much faster
query_result = df.filter(sql).collect() # faster
1条答案
按热度按时间k2fxgqgv1#
回答我自己的问题:
主要原因似乎是每个文件太小,元数据检查时间主导了查询响应时间。当文件足够大(即,至少大于块大小,它应该是),查询响应时间将由结果io决定。