我在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...
我很想知道是否有人能确认这就是它的工作方式(每列一个元存储检查),以及我是否需要计划元存储检查的开销。
1条答案
按热度按时间oknwwptz1#
我对这种行为感到惊讶,因为它不适合spark处理模型,而且我无法在scala中复制它。有可能它在某种程度上是特定于pyspark的,但我对此表示怀疑,因为pyspark只是一个用于创建spark计划的api。
然而,现在的情况是
withColumn(...)
对方案进行了分析。如果计划很大,这可能需要一段时间。不过,有一个简单的优化。替换多个withColumn(...)
调用独立列df.select(F.col("*"), F.col("col2").as("new_col2"), ...)
. 在这种情况下,只执行一次分析。在一些非常大的计划中,我们为一个笔记本电池节省了10多分钟的分析时间。