Dataframe Spark是否总是在动作发生时读取数据

Dataframe Spark是否总是在动作发生时读取数据,dataframe,pyspark,lazy-evaluation,Dataframe,Pyspark,Lazy Evaluation,我是Spark的新手,我了解到有转变和行动。转换返回新的RDD和数据帧,操作对它们进行操作。除非未调用操作,否则不会执行任何转换。除非请求任何操作,否则转换只是沿袭中的步骤。所以,当我读取一个数据帧时,它也是一个转换,如果我在读取后调用同一数据帧上的两个操作,它是读取两次还是只读取一次,然后对它们执行操作 df = ss.read.csv('test.csv') df.count() df.take(5) 一个操作通常会导致执行,在您声明时读取。这不是操作的情况,而是实际执行的情况——除了需要

我是Spark的新手,我了解到有转变和行动。转换返回新的RDD和数据帧,操作对它们进行操作。除非未调用操作,否则不会执行任何转换。除非请求任何操作,否则转换只是沿袭中的步骤。所以,当我读取一个数据帧时,它也是一个转换,如果我在读取后调用同一数据帧上的两个操作,它是读取两次还是只读取一次,然后对它们执行操作

df = ss.read.csv('test.csv')
df.count()
df.take(5)

一个操作通常会导致执行,在您声明时读取。这不是操作的情况,而是实际执行的情况——除了需要执行的作业的一些例外情况

如果尚未缓存/持久化数据,则将多次读取数据,除非发生某些跳过的操作

延迟执行和沿袭意味着可以优化代码


像take(n)这样的东西是优化的。这场演出也有特殊的考虑

为了完整起见,我想补充一点,读取两次数据并不是一件坏事——它通常可以用作一种优势;)@GrzegorzSkibinski您可以详细说明。take是一个特殊的优化案例;对于count,关于是否需要一次读取所有内容存在争议,这可能会被优化,但我认为目前是这样,所以必须选中Yes,没有跳过,都读取,但是take(n)不需要读取所有内容。