对大数据执行Distinct操作

问题描述 投票:0回答:1

当我们在 Spark 中对 delta 表或 s3/gcs 数据文件执行

distinct
操作时,它是否会像
group by
那样将整个数据拉到单个执行器? 如果一个表的数据量很大,那么spark在单个executor中执行操作,我们如何处理这样的用例?

#sql 
select distinct <all columns> from table/dataframe

or

#pyspark
df.select("*").distinct()

scala apache-spark pyspark
1个回答
0
投票

spark 中有两种主要的动作:Transformations 和 Actions。

Action 将立即触发计算并将结果收集到本地计算机(假设您使用的是 Spark-shell)。

转换将生成一个新的数据集,但不会实际计算它,除非您触发

Action

Spark 中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记住应用于某些基础数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时才计算转换。这样的设计使得Spark能够更高效地运行。例如,我们可以意识到,通过map创建的数据集将用于reduce,并且只将reduce的结果返回给驱动程序,而不是更大的映射数据集。

您可以发现

distinct
transformation
官方文档

distinct([numPartitions])) 返回包含源数据集的不同元素的新数据集。

因此,对于您的第一个问题,

distinct
不会将所有数据集收集到您的驱动程序计算机。

如果您正在处理大型数据集,那么将数据收集到驱动程序并不是一个好主意。更好的方法是将结果写入分布式存储,例如 HDFS 或 S3。

© www.soinside.com 2019 - 2024. All rights reserved.