Spark.read.csv() 是操作还是转换

Man*_*Das 7 python apache-spark pyspark

Bill在《Spark权威指南》一书中说,阅读是一种转变,而且是一种狭义的转变,

现在,如果我运行下面的 Spark 代码并尝试查看 Spark UI,我会看到创建的作业 df = spark.read.csv("path/to/file")

现在根据我的理解,工作是一个被称为的动作。另外,如果我在读取 CSV 时尝试输入一些选项,我会在 Spark UI 中看到另外一项作业,因此,例如,如果我们运行以下代码,则 Spark UI 中会有 2 个作业 df = spark.read.option("inferSchema", "true").csv("path/to/file")

所以我的问题是,如果spark.read这是一种转变,为什么它会创造就业机会?

akh*_*lly 37

根据您提供的参数,转换(尤其是读取操作)可以以两种方式运行。

  1. 延迟评估 --> 仅当调用操作时才会执行
  2. 热切评估 --> 将触发作业进行一些初步评估

如果是 read.csv()

  • 如果在没有定义模式的情况下调用它并且 inferSchema 被禁用,它会将列确定为字符串类型,并且仅读取第一行来确定名称(如果 heade=True,否则给出默认列名称)和字段数。基本上它执行限制为 1 的收集操作 --> 这就是为什么你可以看到第一个作业

您可以在 Spark UI 中看到下面的 WholeStageCodeGen,如下所示:

在此输入图像描述

您还可以看到如下的物理计划:

在此输入图像描述

  • 现在,如果您指定 inferSchema=True,则将首先触发上面的作业,并且将触发另一个作业,该作业将扫描整个记录以确定模式 --> 这就是为什么您能够在 Spark UI 中看到两个作业

对于第二个作业,Spark UI 中执行器的聚合指标将如下所示(突出显示读取的记录数): 在此输入图像描述

  • 现在,如果您通过向 read.csv() 的“schema”参数提供 StructType() 架构对象来显式指定架构,那么您可以看到此处不会触发任何作业。这是因为,我们已经明确提供了列数和类型,并且 Spark 目录将存储该信息,现在不需要扫描文件来获取该信息。这将在调用操作时延迟验证

  • 这是一个很好的答案 - 令人惊讶的是它没有被标记为已接受。 (2认同)