在pyspark中将DataFrame show()的结果保存为字符串

19

我想在pyspark中捕获show的结果,类似于这里这里。我没有找到pyspark的解决方案,只有scala。

df.show()
#+----+-------+
#| age|   name|
#+----+-------+
#|null|Michael|
#|  30|   Andy|
#|  19| Justin|
#+----+-------+

最终目的是将此字符串捕获在我的logger.info中。 我尝试过logger.info(df.show()),但那只会在控制台上显示。

1个回答

28
你可以使用与你链接的文章Capturing the result of explain() in pyspark相同的方法来构建一个辅助函数。只需查看show()的源代码并观察它调用了self._jdf.showString()。答案取决于你使用的spark版本,因为show()的参数数量随时间变化而改变。Spark 2.3及以上版本中添加了vertical参数。
def getShowString(df, n=20, truncate=True, vertical=False):
    if isinstance(truncate, bool) and truncate:
        return(df._jdf.showString(n, 20, vertical))
    else:
        return(df._jdf.showString(n, int(truncate), vertical))

Spark版本1.5至2.2

从版本1.5开始,添加了truncate参数。

def getShowString(df, n=20, truncate=True):
    if isinstance(truncate, bool) and truncate:
        return(df._jdf.showString(n, 20))
    else:
        return(df._jdf.showString(n, int(truncate)))

Spark版本1.3到1.4

show函数首次引入于1.3版本。

def getShowString(df, n=20):
    return(df._jdf.showString(n))

现在按照以下方式使用辅助函数:
x = getShowString(df)  # default arguments
print(x)
#+----+-------+
#| age|   name|
#+----+-------+
#|null|Michael|
#|  30|   Andy|
#|  19| Justin|
#+----+-------+

或者在你的情况下:

logger.info(getShowString(df))

2
哎呀,我遇到了一个错误,显示“showString”不存在。在调用o10175.showString时发生了错误。跟踪信息如下: py4j.Py4JException: 方法showString([class java.lang.Integer])不存在 at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318) at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326) at py4j.Gateway.invoke(Gateway.java:274) - Kenny
1
@Kenny,你使用的是哪个版本的Spark(print(spark.version))?你必须使用特定于你的Spark版本的函数。 - pault
1
版本2.2。请忽略错误。我混淆了n和20。应该有两个参数。非常好的答案,谢谢@pault。 - Kenny
1
难以置信,他们甚至在3.x版本中都没有提供这样的辅助函数。 - ciurlaro
一切都按预期进行。非常感谢。 - Advait Baxi

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