3

目前在Databricks 交互式集群上使用 PySpark (使用Databricks-connect提交作业)和Snowflake作为输入/输出数据。

我的 Spark 应用程序应该从 Snowflake 读取数据,应用一些简单的 SQL 转换(主要是F.when.otherwise,窄转换),然后将其加载回 Snowflake。(仅供参考,模式被传递给雪花阅读器和作家)

编辑:在过程结束时,在写作之前还有一个排序转换。

出于测试目的,我将我的工作命名为:(应该命名为 Writer 和 Reader)

sc.setJobDescription("Step Snowflake Reader")

我无法理解 Spark UI 向我展示的内容:

在此处输入图像描述

所以,我得到了 3 个工作,所有工作名称都相同(作家)。我可以理解我只有一个 Spark Action,所以假设有一个作业,所以 Spark 确实将作业命名为 sc.setJobDescription 设置的最后一个值(Reader,触发 spark 计算)。

我也标记了我的“ReaderClass”

sc = spark.sparkContext
sc.setJobDescription("Step Snowflake Reader")

为什么不显示?

第一个工作是像“从雪花下载数据”,第二个“应用 SQL 转换”,然后是第三个“上传数据到雪花”?

为什么我所有的工作都与同一个 SQL 查询有关?什么是与...零工作相关的查询 0?

SQL 查询

SQL查询物理计划 感谢帮助。

4

1 回答 1

0

这有几件事。首先,一个作业是针对一个动作触发的,而转换并不是其中的一部分(它们是在一个动作期间计算的,但是一个动作可以进行多个转换)。在您的情况下,读取、转换和排序,所有这些步骤都将在触发操作时发生

请注意,从雪花读取不会触发作业(这是一个假设,因为 Hive 表现出相同的行为),因为雪花已经具有通过遍历文件来触发所需的元数据。如果您直接读取 parquet 文件,它将触发不同的作业,并且您将能够看到作业描述。

现在是你命名你的工作的部分

sc.setJobDescription("Step Snowflake Reader")

这将命名由您的写入操作触发的作业。而这个动作又会调用多个作业(但仍然是您正在执行的最后一个动作的一部分,请参阅此处了解更多详细信息,请参阅这篇文章

同样,您在调用操作之前所做的最后一个配置被拾取(例如,设置shufflePartition 也会发生同样的事情,您可能希望有一个或多或少 shuffle 的特定步骤,但对于 1 个完整的操作,它将被设置为单个值)

希望这能回答你的问题。

于 2021-12-13T17:24:00.080 回答