Apache spark 为什么采样数据帧上的count()接受相同数量的输入?
在以原始数据的1%采样的数据帧(新的_df)上运行count()时,输入数据似乎是相同的(下面的阶段id 40和41),就像我在完整数据集(下面的阶段id 42和43)上运行count()一样 为什么呢,我认为懒惰优化会在采样数据上产生更小的数据流量Apache spark 为什么采样数据帧上的count()接受相同数量的输入?,apache-spark,pyspark,Apache Spark,Pyspark,在以原始数据的1%采样的数据帧(新的_df)上运行count()时,输入数据似乎是相同的(下面的阶段id 40和41),就像我在完整数据集(下面的阶段id 42和43)上运行count()一样 为什么呢,我认为懒惰优化会在采样数据上产生更小的数据流量 我认为在这种情况下,主要问题是DataFrame类的sample方法进行了完整的数据扫描。无论分数有多小,所有数据都将被读取 Spark首先扫描所有数据,然后获取其中的一小部分。因此,count对子采样数据级别的操作将使用此机制,并且需要足够的资源
我认为在这种情况下,主要问题是
DataFrame
类的sample
方法进行了完整的数据扫描。无论分数有多小,所有数据都将被读取
Spark首先扫描所有数据,然后获取其中的一小部分。因此,
count
对子采样数据级别的操作将使用此机制,并且需要足够的资源来读取所有数据。请澄清这两个数据帧的创建df
包含双倍的data.parquet
文件内容。但是由于给定的代码未定义,因此new_df
。谢谢,是的,new_df是采样的结果。我在上面编辑过。不确定是否相关,但数据集的磁盘空间约为5GB。我尝试使用越来越小的数据集,但效果仍然相同。好的,我编辑了我的答案)谢谢。我想这解决了我的问题。如果您知道一种方法,以避免全面扫描,这将是高度赞赏。我有数据,我真的不想在工程阶段每次都被完全扫描。我认为现在没有简单的方法可以做到这一点,解决方案将取决于任务上下文。一种方法是使用数据分区(如果存在),另一种方法是只读取一些文件,而不是全部读取。
df = spark.read.load("hdfs://spark-storage:9000/tmp/data.parquet", format="parquet")
df = df.union(df)
new_df = df.sample(False, 0.01)
new_df.count() # Stage id 40 & 41
df.count() # Stage if 42 & 43