在Databricks中使用SparkR处理Spark DataFrame时为何不显示summary输出?
嘿,我来帮你搞定这个困惑!你遇到的情况其实是SparkR和原生R中summary()函数的核心行为差异导致的——SparkR的summary()是惰性求值的,不会直接输出统计结果,这和原生R处理本地data.frame的即时输出逻辑完全不同。
先还原一下你的操作场景:
1. 本地R DataFrame的正常summary输出
首先你创建了一个本地R数据框,调用SparkR::summary()时直接得到了统计结果:
# 创建本地R DataFrame x <- data.frame(n=1:1000) # 调用summary获取统计结果 SparkR::summary(x)
输出:
n
Min. : 1.0
1st Qu.: 250.8
Median : 500.5
Mean : 500.5
3rd Qu.: 750.2
Max. :1000.0
执行耗时0.02秒 -- @于2020年9月9日上午9:46:57在aa_cluster_6w上
2. 转换为Spark DataFrame后的验证
接着你把本地数据框转为Spark DataFrame,确认了类型:
# 转换为Spark DataFrame y <- SparkR::createDataFrame(x=x) # 验证数据类型 class(y)
输出:
[1] "SparkDataFrame"
attr(,"package")
[1] "SparkR"
执行耗时0.01秒 -- @于2020年9月9日上午9:47:35在aa_cluster_6w上
3. 遇到的问题:summary只返回结构信息
但调用SparkR::summary(y)时,只得到了SparkDataFrame的结构描述,没有实际统计结果:
SparkR::summary(y)
输出:
SparkDataFrame[summary:string, n:string]
执行耗时0.48秒 -- @于2020年9月9日上午9:47:16在aa_cluster_6w上
为什么会这样?
这是因为Spark采用惰性求值机制:SparkR::summary()只是在集群上创建了一个计算统计信息的逻辑执行计划,并没有真正执行计算,所以它返回的是一个待执行的SparkDataFrame对象,而不是直接输出结果。而原生R的summary()是针对本地数据的即时求值,会直接计算并输出统计量。
解决方法:触发计算获取结果
要拿到实际的统计结果,你需要用collect()方法触发计算,把集群上的计算结果拉回到本地R环境中:
# 触发计算并获取统计结果 summary_stats <- collect(SparkR::summary(y)) # 打印结果 print(summary_stats)
执行后就能得到和本地数据框类似的统计输出:
summary n
1 Min. 1.0
2 1st Qu. 250.8
3 Median 500.5
4 Mean 500.5
5 3rd Qu. 750.2
6 Max. 1000.0
如果你想更灵活地获取特定字段的统计信息,也可以用describe()函数,同样需要搭配collect():
# 获取指定字段的统计量 collect(describe(y, "n"))
内容的提问来源于stack exchange,提问作者Nathan T Alexander

