Spark 1.6:过滤 describe() 生成的数据帧
Spark 1.6: filtering DataFrames generated by describe()
当我在 DataFrame 上调用 describe
函数时出现问题:
val statsDF = myDataFrame.describe()
调用 describe 函数产生以下输出:
statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string]
我调用statsDF.show()
可以正常显示statsDF
+-------+------------------+
|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
您可以 select 来自数据框:
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|
+------------------+-------------------+------------------+
您也可以将其注册为table并查询table:
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 上运行得很好
当我在 DataFrame 上调用 describe
函数时出现问题:
val statsDF = myDataFrame.describe()
调用 describe 函数产生以下输出:
statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string]
我调用statsDF.show()
可以正常显示statsDF
+-------+------------------+
|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
您可以 select 来自数据框:
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|
+------------------+-------------------+------------------+
您也可以将其注册为table并查询table:
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 上运行得很好