У меня есть база данных 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) Если бы мне пришлось сообщать о времени выполнения, было бы более справедливо сообщать о времени, когда он был выполнен первым или вторым?