hive - 查询包含大量列的 Hive 表时,是否可以减少 MetaStore 检查的次数?

标签 hive pyspark databricks azure-databricks hive-metastore

我在 databricks 上使用 spark sql,它使用 Hive 元存储,并且我正在尝试设置一个使用相当多列(20+)的作业/查询。

运行 Metastore 验证检查所需的时间与我的查询中包含的列数呈线性关系 - 有没有办法跳过这一步?或者预先计算检查?或者至少让 Metastore 每表只检查一次而不是每列一次?

一个小例子是,当我运行下面的命令时,甚至在调用 display 或 collect 之前,Metastore 检查器也会发生一次:

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

当我运行以下命令时,Metastore 检查器会发生多次,因此需要更长的时间:
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")
)

Metastore 检查它在驱动程序节点中的执行情况如下:
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...

我很想知道是否有人可以确认这就是它的工作方式(每列 Metastore 检查),以及我是否必须计划 Metastore 检查的开销。

最佳答案

我对这种行为感到惊讶,因为它不适合 Spark 处理模型,而且我无法在 Scala 中复制它。它可能在某种程度上特定于 PySpark,但我怀疑因为 PySpark 只是用于创建 Spark 计划的 API。

然而,发生的事情是在每个 withColumn(...) 之后计划进行分析。如果计划很大,这可能需要一段时间。但是,有一个简单的优化。替换多个 withColumn(...)使用 df.select(F.col("*"), F.col("col2").as("new_col2"), ...) 调用独立列.在这种情况下,将只执行一次分析。

在某些超大型计划的情况下,我们为单个笔记本单元节省了 10 多分钟的分析时间。

关于hive - 查询包含大量列的 Hive 表时,是否可以减少 MetaStore 检查的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59665429/

相关文章:

sql - HIVE 检查表 1 中的数据,而表 2 中没有

python - Pyspark 中的 None/== vs Null/isNull?

apache-spark - 如何在Databricks中显示所有数据库中的所有表

apache-spark - 通过 Databricks 笔记本更改表表名 CONCATENATE 错误

python - 如何在databricks上运行python3?

sql - 何时选择 rank() 而不是密集的 rank() 或 row_number()

windows-7 - 32位操作系统上的Apache Hive

string - Hive:将字符串转换为整数

pyspark - 应用窗口函数计算 pySpark 中的差异

azure - 读取 CSV 时,是否可以选择从第 2 行或以下行开始?