在pyspark中捕获explain()的结果

Bor*_*iev 9 apache-spark pyspark

在pyspark中,运行:

sdf = sqlContext.sql("""SELECT * FROM t1 JOIN t2 on t1.c1 = t2.c1 """)

进而:

sdf.explain(extended=True)

它打印查询执行的逻辑和物理计划。

我的问题是:如何在变量中捕获输出,而不是打印它?

v = sdf.explain(extended=True) 自然,不起作用

Ste*_*ven 13

如果您查看explain(2.4 版或更早版本)的源代码,您会看到:

def explain(self, extended=False):
    if extended:
        print(self._jdf.queryExecution().toString())
    else:
        print(self._jdf.queryExecution().simpleString())
Run Code Online (Sandbox Code Playgroud)

因此,如果您想直接检索解释计划,只需_jdf.queryExecution()在您的数据帧上使用该方法:

v = sdf._jdf.queryExecution().toString()  # or .simpleString()
Run Code Online (Sandbox Code Playgroud)

3.0 开始,代码是:

print(
    self._sc._jvm.PythonSQLUtils.explainString(self._jdf.queryExecution(), explain_mode)
)
Run Code Online (Sandbox Code Playgroud)

删除打印,你会得到explain一个字符串。