如何在pyspark中获取数据帧的分区?

时间:2018-03-13 02:08:58

标签: pyspark

有很多关于如何对dataframe / rdd进行分区以提高性能的帖子。我的问题要简单得多:显示数据帧分区器的最直接方式是什么?通过查看名称,我猜df.rdd.partitioner将返回分区程序,但是,它总是返回None:

df = spark.createDataFrame((("A", 1), ("B", 2), ("A", 3), ("C", 1)),['k','v']).repartition("k")

df.rdd.partitioner #None

我发现找到分区程序的一种方法是读取df.explain()的输出。但是,这打印了很多其他信息(物理计划)。是否有更直接的方式来显示dataframe / rdd的分区器?

1 个答案:

答案 0 :(得分:0)

正如上面评论中所建议的(mayank agrawal),我们可以使用 executionQuery 对象来获得一些见解。

如果我们没有桌子,我们可以使用:

df._jdf.queryExecution().executedPlan().prettyJson()
df._jdf.queryExecution().sparkPlan().outputPartitioning().prettyJson()

哪个符合我们的目标

或者如果我们有一个蜂巢表,那么我们也可以有这样的东西:

table = df._jdf.queryExecution().logical().tableName()

catalog = c.Catalog(spark)
for col in catalog.listColumns(table.split(".")[1], table.split(".")[0]):
    if col.isBucket:
        print(f"bucketed by {col.name}")