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
这是一次转变,为什么它会创造就业机会?
根据您提供的参数,转换(尤其是读取操作)可以以两种方式运行。
- 延迟评估 --> 仅当调用操作时才会执行
- 热切评估 --> 将触发作业进行一些初步评估
如果是 read.csv()
- 如果在没有定义模式的情况下调用它并且 inferSchema 被禁用,它会将列确定为字符串类型,并且仅读取第一行来确定名称(如果 heade=True,否则给出默认列名称)和字段数。基本上它执行限制为 1 的收集操作 --> 这就是为什么你可以看到第一个作业
您可以在 Spark UI 中看到下面的 WholeStageCodeGen,如下所示:
您还可以看到如下的物理计划:
- 现在,如果您指定 inferSchema=True,则将首先触发上面的作业,并且将触发另一个作业,该作业将扫描整个记录以确定模式 --> 这就是为什么您能够在 Spark UI 中看到两个作业
For second job , aggregated metrics by executor in Spark UI will lokk like this (highlighted the number of records read):
- 现在,如果您通过向 read.csv() 的“schema”参数提供 StructType() 架构对象来显式指定架构,那么您可以看到此处不会触发任何作业。这是因为,我们已经明确提供了列数和类型,并且 Spark 目录将存储该信息,现在不需要扫描文件来获取该信息。这将在调用操作时延迟验证
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)