我在 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/