当我们在 Spark 中对 delta 表或 s3/gcs 数据文件执行
distinct
操作时,它是否会像 group by
那样将整个数据拉到单个执行器?
如果一个表的数据量很大,那么spark在单个executor中执行操作,我们如何处理这样的用例?
#sql
select distinct <all columns> from table/dataframe
or
#pyspark
df.select("*").distinct()
spark 中有两种主要的动作:Transformations 和 Actions。
Action 将立即触发计算并将结果收集到本地计算机(假设您使用的是 Spark-shell)。
转换将生成一个新的数据集,但不会实际计算它,除非您触发
Action
。
Spark 中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记住应用于某些基础数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时才计算转换。这样的设计使得Spark能够更高效地运行。例如,我们可以意识到,通过map创建的数据集将用于reduce,并且只将reduce的结果返回给驱动程序,而不是更大的映射数据集。
您可以发现
distinct
是 transformation
的 官方文档
distinct([numPartitions])) 返回包含源数据集的不同元素的新数据集。
因此,对于您的第一个问题,
distinct
不会将所有数据集收集到您的驱动程序计算机。
如果您正在处理大型数据集,那么将数据收集到驱动程序并不是一个好主意。更好的方法是将结果写入分布式存储,例如 HDFS 或 S3。