pyspark Spark.read.csv()是Action还是Transformation

n3schb8v  于 5个月前  发布在  Spark
关注(0)|答案(2)|浏览(65)

在《星火燎原指南》一书中,比尔说,阅读是一种转变,而且是一种狭义的转变,
现在,如果我运行下面的spark代码并尝试查看spark UI,我会看到创建了一个作业df = spark.read.csv("path/to/file")
根据我的理解,作业是一个名为的操作。如果我在阅读CSV时尝试放入一些选项,我会在spark UI中看到多一个作业,因此,例如,当我们运行下面的代码时,在spark UI df = spark.read.option("inferSchema", "true").csv("path/to/file")中有2个作业
所以我的问题是,如果spark.read是一个转换,为什么它会创建Job?

0sgqnhkj

0sgqnhkj1#

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

  1. Lazily evaluated -->只有当一个动作被调用时才会执行
    1.自动评估-->将触发一个作业进行一些初始评估
    如果是read.csv()
  • 如果在没有定义模式的情况下调用它,并且inferSchema被禁用,则它将列确定为字符串类型,并且它只读取第一行以确定名称(如果heade=True,则它给出默认列名)和字段的数量。

你可以在Spark UI中看到下面的WholeStageCodeGen:
x1c 0d1x的数据
你也可以看到物理平面图如下:


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

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

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

iyzzxitl2#

与RDD相比,通过Catalyst的Spark Dataframes内置了一些智能。
其中之一是当你声明infer schema时,由于这可能需要很长时间,水下Spark已经启动了一个Job来进行模式推断。就这么简单。这是优化和性能方面的事情,不能被视为Action或Transformation。另一个例子是一个框架的旋转。

相关问题