在pyspark中如何捕获explain()的结果

11
在pyspark中,运行以下命令: sdf = sqlContext.sql("""SELECT * FROM t1 JOIN t2 on t1.c1 = t2.c1 """) 然后: sdf.explain(extended=True) 它会打印查询执行的逻辑和物理计划。 我的问题是:如何在变量中捕获输出,而不是将其打印出来? 自然而然地,v = sdf.explain(extended=True)无法工作。
1个回答

20
如果您查看版本为2.4或早期版本的explain 的源代码,您会发现:
def explain(self, extended=False):
    if extended:
        print(self._jdf.queryExecution().toString())
    else:
        print(self._jdf.queryExecution().simpleString())
因此,如果您想直接检索解释计划,请在数据框上使用方法 _jdf.queryExecution()
v = sdf._jdf.queryExecution().toString()  # or .simpleString()

3.0版本开始,代码如下:

print(
    self._sc._jvm.PythonSQLUtils.explainString(self._jdf.queryExecution(), explain_mode)
)

去掉 print,你会得到一个字符串形式的 explain


谢谢!我从这个例子中学到了很多。现在正在搜索如何解决执行计划字符串截断的问题(但那是另一个话题 :))。 - Borislav Aymaliev
1
@MattMoehr更新了帖子并附上了版本参考。 - Steven
从那个链接到"3.0"版本的源文件中,explain_mode 的取值为 "simple" 和 "extended"。 - John Haberstroh
从链接到“3.0”版本的源代码中,explain_mode的取值可以是“simple”和“extended”。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接