HDFS Pyspark中的限制(n)与显示(n)性能差异

7kqas0il  于 2022-12-09  发布在  HDFS
关注(0)|答案(2)|浏览(197)

试图更深入地了解spark是如何工作的,并在玩pyspark cli(2.4.0)。我一直在寻找使用limit(n).show()show(n)之间的区别。我最终得到了两个非常相似的查询的两个非常不同的性能时间。下面是我运行的命令。下面代码中引用的parquet文件大约有50列,在远程HDFS上的大小超过50gb。

# Create dataframe
>>> df = sqlContext.read.parquet('hdfs://hdfs.host/path/to.parquet') ↵

# Create test1 dataframe
>>> test1 = df.select('test_col') ↵
>>> test1.schema ↵
StructType(List(StructField(test_col,ArrayType(LongType,true),true)))
>>> test1.explain() ↵
== Physical Plan ==
*(1) Project [test_col#40]
+- *(1) FileScan parquet [test_col#40]
    Batched: false,
    Format: Parquet,
    Location: InMemoryFileIndex[hdfs://hdfs.host/path/to.parquet],
    PartitionCount: 25,
    PartitionFilters: [],
    PushedFilters: [],
    ReadSchema: struct<test_col:array<bigint>>

# Create test2 dataframe
>>> test2 = df.select('test_col').limit(5) ↵
>>> test2.schema ↵
StructType(List(StructField(test_col,ArrayType(LongType,true),true)))
>>> test2.explain() ↵
== Physical Plan ==
CollectLimit 5
+- *(1) Project [test_col#40]
   +- *(1) FileScan parquet [test_col#40]
     Batched: false,
     Format: Parquet,
     Location: InMemoryFileIndex[hdfs://hdfs.host/path/to.parquet],
     PartitionCount: 25,
     PartitionFilters: [],
     PushedFilters: [],
     ReadSchema: struct<test_col:array<bigint>>

请注意,test1test2的物理计划几乎是相同的。唯一的例外是test2的计划以“CollectLimit 5”开始。设置好这个之后,我运行了test1.show(5)test2.show(5)。测试1立即返回了结果。测试2显示了一个进度条,其中包含2010个任务,大约需要20分钟才能完成(我只有一个执行器)
问题:为什么测试2(有限值)与测试1(无限值)相比表现如此差?数据集和结果集相同,物理计划几乎相同。

4xrmg8kj

4xrmg8kj1#

请记住:

  • show()show(20)的别名,在内部依赖于take(n: Int): Array[T]
  • limit(n: Int)返回另一个数据集,这是一个读取整个源的开销很大的操作
vd8tlhqk

vd8tlhqk2#

限制-导致生成新 Dataframe 并花费更长时间,因为您输入文件格式当前不支持 predicate 下推因此阅读整个数据集并应用限制

相关问题