Spark 2.2: использует ли Spark SQL результаты ранее выполненных запросов в памяти? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть база данных Hive, и все таблицы из моих примеров являются таблицами Hive в формате Parquet.

Предположим, это первые два Spark SQL-запроса моего приложения (схема упрощена дляради вопроса):

1) val df1 = spark.sql("select * from T1 where T1.col1 = 'a'")
2) val df2 = spark.sql("select * from T1 where T1.col2 = 'b'")

Когда я выполняю действие, я получаю разное время в зависимости от порядка:

df1.count()
Time taken: 18062 ms
df2.count()
Time taken: 7037 ms

(в другом приложении / оболочке Spark)

df2.count()
Time taken: 20330 ms
df1.count()
Time taken: 4131 ms

Один способ, которым я пытаюсь объяснить это, заключается в том, что второй кадр данных может использовать информацию в памяти, оставленную предыдущим выполнением, потому что оба кадра данных обращаются к одной и той же таблице .

Однако на днях я попробовал нечто похожее на это на двух разных таблицах, T1 и T2 :

1) val df3 = spark.sql("select * from T1 where T1.col1 = 'c'")
2) val df4 = spark.sql("select * from T2 where T2.col1 = 'd'")

и получил:

df3.count()
Time taken: 18062 ms
df4.count()
Time taken: 712 ms

(в другом приложении / оболочке Spark)

df4.count()
Time taken: 11447 ms
df3.count()
Time taken: 15042 ms

Похоже, что последний кадр данных всегда выполняется лучше, чем если бы он был выполнен первым.

1) Как это возможно?особенно вслучай, когда две разные таблицы доступны?Как я могу это объяснить?

2) Если это не связано с повторным использованием данных в памяти, есть ли способ избавиться от накладных расходов при первом выполнении?

3) Если бы мне пришлось сообщать о времени выполнения, было бы более справедливо сообщать о времени, когда он был выполнен первым или вторым?

...