通过查看spark-sql计划,是否有一种方法可以告诉我是否正在使用特定的表(hive/iceberg)分区?
例如,我们有一个有3个分区的表,假设a =A_VAL, B=B_VAL, C=C_VAL。通过查看计划,我是否可以知道
- 分区已被充分使用(所有3个分区已被使用)
- 分区只被部分使用(可能只有1或2个分区被使用,例如分区A被使用,但现在B或C被使用)
如果spark-sql计划不提供此信息,是否有任何方法可以获得此信息?
您可以使用下面的代码来打印(逻辑和物理)计划。
import pyspark.sql
#create a df using your sql
df = sqlContext.sql("SELECT field1 AS f1, field2 as f2 from table1")
#use explain to see explain output. Without argument, you will get only physical plan
df.explain(True)
== Parsed Logical Plan ==
...
== Analyzed Logical Plan ==
...
== Optimized Logical Plan ==
...
== Physical Plan ==
...
编辑:我对我的表进行了解释,并在下面发布了摘录。这表明hive只选择了几个分区(文件夹),而没有遍历所有分区。您应该能够看到类似的输出。
表在part_col上分区。
用于生成此explain extended select * from mytab where part_col in (10,50)
的查询。
对不起,我没有安装spark,所以不能测试它。
29
Path -> Alias:
30
hdfs://namenode:8020/user/hive/warehouse/tmp/part_col=10.0 [tmp]
31
hdfs://namenode:8020/user/hive/warehouse/tmp/part_col=50.0 [tmp]
32
Path -> Partition:
33
hdfs://namenode:8020/user/hive/warehouse/tmp/part_col=10.0
34
Partition
35
base file name: part_col=10.0
36
input format: org.apache.hadoop.mapred.TextInputFormat
37
...
hdfs://namenode:8020/user/hive/warehouse/tmp/part_col=50.0
85
Partition
86
base file name: part_col=50.0
87
input format: org.apache.hadoop.mapred.TextInputFormat
88
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
89
partition values:
90
college_marks 50.0