在查询包含大量列的配置单元表时,是否可以减少元存储检查的数量?

vlju58qv  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(547)

我在databricks上使用sparksql,它使用一个hive元存储,并且我正在尝试设置一个使用相当多的列(20+)的作业/查询。
运行metastore验证检查所需的时间与我的查询中包含的列数成线性比例-有没有方法跳过这一步?或者预先计算支票?或者至少让metastore每个表只检查一次,而不是每个列检查一次?
一个小例子是,当我运行以下命令时,甚至在调用display或collect之前,metastore checker也会发生一次:

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

当我运行以下命令时,metastore checker会发生多次,因此需要更长的时间:

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

databricks上的用户视图是:

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

我很想知道是否有人能确认这就是它的工作方式(每列一个元存储检查),以及我是否需要计划元存储检查的开销。

oknwwptz

oknwwptz1#

我对这种行为感到惊讶,因为它不适合spark处理模型,而且我无法在scala中复制它。有可能它在某种程度上是特定于pyspark的,但我对此表示怀疑,因为pyspark只是一个用于创建spark计划的api。
然而,现在的情况是 withColumn(...) 对方案进行了分析。如果计划很大,这可能需要一段时间。不过,有一个简单的优化。替换多个 withColumn(...) 调用独立列 df.select(F.col("*"), F.col("col2").as("new_col2"), ...) . 在这种情况下,只执行一次分析。
在一些非常大的计划中,我们为一个笔记本电池节省了10多分钟的分析时间。

相关问题