我在databricks上使用spark,它使用的是Hive转移,我正在尝试设置一个使用相当多列(20+)的作业/查询。
运行亚稳态验证检查所需的时间与我的查询中包含的列数成线性关系--有任何方法可以跳过这个步骤吗?或者预先计算支票?或者至少让亚稳态只检查一次,而不是每列一次?
一个小的例子是,当我运行下面的程序时,即使在调用显示或收集之前,也只会发生一次亚稳态检查:
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对databricks上的用户的视图是:
Performing Hive catalog operation: databaseExists
Performing Hive catalog operation: tableExists
Performing Hive catalog operation: getRawTable
Running command...我想知道是否有人能确认这就是它的工作方式(每列一次亚稳态检查),以及我是否必须计划一下亚稳态检查的开销。
发布于 2020-01-21 06:18:33
我对这种行为感到惊讶,因为它不符合星火处理模型,而且我不能在Scala中复制它。它可能在某种程度上是特定于PySpark的,但我怀疑,因为PySpark只是一个用于创建星火计划的API。
然而,正在发生的事情是,在每一次withColumn(...)之后,计划都会被分析。如果计划很大,这可能需要一段时间。然而,有一个简单的优化。用withColumn(...)替换对独立列的多个df.select(F.col("*"), F.col("col2").as("new_col2"), ...)调用。在这种情况下,将只执行一次分析。
在一些非常大的计划中,我们为单个笔记本单元节省了10+分钟的分析时间。
https://stackoverflow.com/questions/59665429
复制相似问题