Запрос Spark SQL из нескольких файлов паркета выполняется намного медленнее, чем один паркет для того же общего объема данных - PullRequest
0 голосов
/ 05 августа 2020

Я обнаружил, что использование 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

1 Ответ

0 голосов
/ 20 августа 2020

Ответьте на мой вопрос:

Кажется, основная причина в том, что каждый файл слишком мал, время проверки метаданных преобладает над временем ответа на запрос. Когда файл достаточно велик (то есть, по крайней мере, превышает размер блока, которым он должен быть), время ответа на запрос будет зависеть от результатов ввода-вывода.

...