【问题标题】:Spark 1.6: filtering DataFrames generated by describe()Spark 1.6:过滤由 describe() 生成的 DataFrame
【发布时间】:2016-05-18 06:14:06
【问题描述】:

当我在 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()函数生成的DataFrames?

【问题讨论】:

  • 我投票赞成。现在能够过滤由 describe 创建的 DF 很奇怪

标签: apache-spark apache-spark-sql apache-zeppelin


【解决方案1】:

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

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

【讨论】:

  • @Rami 这应该可以完成这项工作,认为这有点愚蠢和幼稚......告诉我这是否适合你!
  • 谢谢@eliasah,很奇怪我们不能过滤这些 DF。我会考虑向 Spark 的人指出这个问题。
  • @zero323 你怎么看这个问题?我们应该在 JIRA 上打开一个关于它的问题吗?
  • @Rami 这对我来说真的很奇怪!这就是为什么我要问大厨师这件事:)
  • 大厨很棒;)
【解决方案2】:

您可以从数据框中选择:

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

【讨论】:

    【解决方案3】:

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

    myDataFrame.selectExpr('MIN(count)').head()[0]
    

    【讨论】:

      【解决方案4】:
      myDataFrame.describe().filter($"summary"==="stddev").show()
      

      这在 Spark 2.3.0 上运行得非常好

      【讨论】:

      • 也在 Spark 2.1.0 上工作过
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多