Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么采样数据帧上的count()接受相同数量的输入?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 为什么采样数据帧上的count()接受相同数量的输入?

Apache spark 为什么采样数据帧上的count()接受相同数量的输入?,apache-spark,pyspark,Apache Spark,Pyspark,在以原始数据的1%采样的数据帧(新的_df)上运行count()时,输入数据似乎是相同的(下面的阶段id 40和41),就像我在完整数据集(下面的阶段id 42和43)上运行count()一样 为什么呢,我认为懒惰优化会在采样数据上产生更小的数据流量 我认为在这种情况下,主要问题是DataFrame类的sample方法进行了完整的数据扫描。无论分数有多小,所有数据都将被读取 Spark首先扫描所有数据,然后获取其中的一小部分。因此,count对子采样数据级别的操作将使用此机制,并且需要足够的资源

在以原始数据的1%采样的数据帧(新的_df)上运行count()时,输入数据似乎是相同的(下面的阶段id 40和41),就像我在完整数据集(下面的阶段id 42和43)上运行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