Я обнаружил, что использование spark sql (из pyspark) для запроса DataFrame, созданного из нескольких паркетных файлов, намного менее эффективно, чем такое же количество данных, сгенерированных из одного паркетного файла, хотя условие фильтрации не является первым столбцом (так что я думаю, это не индексный материал). Кто-нибудь знает, почему это произойдет? И как сделать так, чтобы время ответа на запрос было таким же эффективным, как у последнего?
# 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