Spark 1.6:过滤由 describe() 生成的数据帧



当我在数据帧上调用describe函数时出现问题:

val statsDF = myDataFrame.describe()

调用描述函数会产生以下输出:

statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string]

我可以通过打电话正常地显示statsDF statsDF.show()

+-------+------------------+
|summary|             count|
+-------+------------------+
|  count|             53173|
|   mean|104.76128862392568|
| stddev|3577.8184333911513|
|    min|                 1|
|    max|            558407|
+-------+------------------+

我现在想从statsDF中获取标准差和平均值,但是当我尝试通过执行以下操作来收集值时:

val temp = statsDF.where($"summary" === "stddev").collect()

我得到了Task not serializable例外。

当我打电话时,我也面临同样的异常:

statsDF.where($"summary" === "stddev").show()

看起来我们无法过滤describe()函数生成的数据帧?

我考虑过一个包含一些健康疾病数据的玩具数据集

val stddev_tobacco = rawData.describe().rdd.map{ 
    case r : Row => (r.getAs[String]("summary"),r.get(1))
}.filter(_._1 == "stddev").map(_._2).collect

您可以从数据帧中进行选择:

from pyspark.sql.functions import mean, min, max
df.select([mean('uniform'), min('uniform'), max('uniform')]).show()
+------------------+-------------------+------------------+
|      AVG(uniform)|       MIN(uniform)|      MAX(uniform)|
+------------------+-------------------+------------------+
|0.5215336029384192|0.19657711634539565|0.9970412477032209|
+------------------+-------------------+------------------+

您也可以将其注册为表并查询该表:

val t = x.describe()
t.registerTempTable("dt")
%sql 
select * from dt

另一种选择是使用同样运行优化的selectExpr(),例如获得最小值:

myDataFrame.selectExpr('MIN(count)').head()[0]
myDataFrame.describe().filter($"summary"==="stddev").show()

这在Spark 2.3.0上工作得很好

相关内容

  • 没有找到相关文章

最新更新