我已经对数据帧进行了分桶,即 bucketBy
和 saveAsTable
。
如果我用 spark.read.parquet
加载它,我不会从优化中受益(无改组)。
scala> spark.read.parquet("${spark-warehouse}/tab1").groupBy("a").count.explain(true)
== Physical Plan ==
*HashAggregate(keys=[a#35117], functions=[count(1)], output=[a#35117, count#35126L])
+- Exchange hashpartitioning(a#35117, 200)
+- *HashAggregate(keys=[a#35117], functions=[partial_count(1)], output=[a#35117, count#35132L])
+- *FileScan parquet [a#35117] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:/Users/yann.moisan/projects/teads/data/spark-warehouse/tab1], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<a:int>
我需要用
spark.table
加载它才能从优化中受益。scala> spark.table("tab1").groupBy("a").count().explain(true)
== Physical Plan ==
*HashAggregate(keys=[a#149], functions=[count(1)], output=[a#149, count#35140L])
+- *HashAggregate(keys=[a#149], functions=[partial_count(1)], output=[a#149, count#35146L])
+- *FileScan parquet default.tab1[a#149] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:/Users/yann.moisan/projects/teads/data/spark-warehouse/tab1], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<a:int>
我不明白为什么 Spark 在第一种情况下不自动检测桶化,例如使用文件名,在这种情况下
part-00007-ca117fc2-2552-4693-b6f7-6b27c7c4bca7_00001.snappy.parquet
有点不同? 最佳答案
简单的。不支持未使用 spark.table
加载为 分桶表 的分桶数据帧。
关于apache-spark - 如何加载可以保留分桶的分桶数据帧?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46799710/