代码之家  ›  专栏  ›  技术社区  ›  user3243499

如何在spark数据帧行上安全地执行getAs操作?

  •  0
  • user3243499  · 技术社区  · 7 年前

    我有一个数据框,如下所示:

    val df = Seq(("x", "y", 1),("x", "z", 2),("x", "a", 4), ("x", "a", 5), ("t", "y", 1), ("t", "y2", 6), ("t", "y3", 3), ("t", "y4", 5)).toDF("F1", "F2", "F3")
    
    
    +---+---+---+
    | F1| F2| F3|
    +---+---+---+
    |  x|  y|  1|
    |  x|  z|  2|
    |  x|  a|  4|
    |  x|  a|  5|
    |  t|  y|  1|
    |  t| y2|  6|
    |  t| y3|  3|
    |  t| y4|  5|
    +---+---+---+
    

    我正在执行筛选和值选择,如下所示:

    df.filter($"F1" === "x" && $"F2"==="y").head.getInt(2)
    

    df.filter($"F1" === "x" && $"F2"==="y").head.getDouble(2)
    

    此外,当筛选的数据帧中没有记录时,以下中断:

    df.filter($"F1" === "x" && $"F2"==="y1").head.getAs[Int]("F3")
    

    那么,如何安全地执行呢 getAs[]() 然后得到价值?如果值 是一个整数或双精度,我希望它始终是双精度的,如果 筛选的数据帧为空,则应返回0.0。

    1 回复  |  直到 7 年前
        1
  •  1
  •   user10724413    7 年前

    根本不要使用动态API和head。明确使用强类型API和强制类型转换类型:

    import org.apache.spark.sql.DataFrame
    
    def get(df: DataFrame) = df.select($"F3".as[Double])
      .take(1).headOption.getOrElse(0.0)
    

    get(df.filter($"F1" === "x" && $"F2"==="y"))
    //  Double = 1.0
    
    get(df.filter($"F1" === "x" && $"F2"==="y1"))
    // Double = 0.0
    
    推荐文章