Можно ли уменьшить количество проверок MetaStore при запросе таблицы Hive с большим количеством столбцов?

Я использую Spark sql для блоков данных, который использует хранилище метаданных Hive, и я пытаюсь настроить задание / запрос, который использует довольно много столбцов (20+).

Время, необходимое для выполнения проверок валидации хранилища метаданных, линейно масштабируется в зависимости от количества столбцов, включенных в мой запрос - есть ли способ пропустить этот шаг? Или предварительно просчитать чеки? Или, по крайней мере, сделать так, чтобы метастор проверял только один раз для каждой таблицы, а не один раз для столбца?

Небольшой пример: когда я запускаю следующее, даже перед вызовом display или collect, проверка хранилища метаданных выполняется один раз:

new_table = table.withColumn("new_col1", F.col("col1")

и когда я запускаю следующее, средство проверки хранилища метаданных выполняется несколько раз и, следовательно, занимает больше времени:

new_table = (table
.withColumn("new_col1", F.col("col1")
.withColumn("new_col2", F.col("col2")
.withColumn("new_col3", F.col("col3")
.withColumn("new_col4", F.col("col4")
.withColumn("new_col5", F.col("col5")
)

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

20/01/09 11:29:24 INFO HiveMetaStore: 6: get_database: xxx
20/01/09 11:29:24 INFO audit: ugi=root    ip=unknown-ip-addr    cmd=get_database: xxx

Вид для пользователя на блоках данных:

Performing Hive catalog operation: databaseExists
Performing Hive catalog operation: tableExists
Performing Hive catalog operation: getRawTable
Running command...

Мне было бы интересно узнать, может ли кто-нибудь подтвердить, что это именно так и работает (проверка хранилища метаданных для каждого столбца), и если мне нужно просто спланировать накладные расходы на проверки хранилища метаданных.


person Louise Fallon    schedule 09.01.2020    source источник
comment
Почему бы не отключить проверку хранилища метаданных? hive.metastore.schema.verification false hive.metastore.schema.verification.record.version false   -  person Deepesh Rehi    schedule 21.01.2020
comment
Кроме того, какая версия Spark? вы можете проверить это: kb.databricks.com/metastore/hive-metastore- Troubleshooting.html   -  person Deepesh Rehi    schedule 21.01.2020


Ответы (1)


Я удивлен таким поведением, поскольку оно не соответствует модели обработки Spark, и я не могу воспроизвести его в Scala. Возможно, что это как-то специфично для PySpark, но я сомневаюсь, что, поскольку PySpark - это просто API для создания планов Spark.

Однако происходит то, что после каждого withColumn(...) план анализируется. Если план большой, это может занять некоторое время. Однако есть простая оптимизация. Замените несколько withColumn(...) вызовов для независимых столбцов на df.select(F.col("*"), F.col("col2").as("new_col2"), ...). В этом случае будет выполнен только однократный анализ.

В некоторых случаях очень больших планов мы сэкономили 10+ минут анализа для одной ячейки записной книжки.

person Sim    schedule 21.01.2020