【问题标题】:What is meant by type safe in spark Dataset ?spark Dataset 中的类型安全是什么意思?
【发布时间】:2018-09-01 23:48:39
【问题描述】:

我试图了解数据集和数据框之间的区别,并找到了以下有用的链接,但我无法理解类型安全的含义?

Difference between DataFrame (in Spark 2.0 i.e DataSet[Row] ) and RDD in Spark

【问题讨论】:

  • 类型安全的意思是“编译时类型安全”,这在 Amit Dubey 在同一篇文章中的回答中得到了非常清楚的解释。请重新阅读。
  • 谢谢。我现在明白了

标签: apache-spark apache-spark-sql


【解决方案1】:

类型安全是 Spark 2.0 中的高级 API。

我们需要这个 API 来对数据集中的行进行更复杂的操作。

例如:

departments.joinWith(people, departments("id") === people("deptId"), "left_outer").show

【讨论】:

  • 您的示例证明数据集不是类型安全的:您只是在连接中使用了字符串:“deptId”、“left_outer”等
【解决方案2】:

RDDs 和 Datasets 是类型安全的,意味着编译器知道 Columns 以及 Column 的数据类型是 Long、String 等......

但是,在 Dataframe 中,每次调用动作时,例如collect(),它会以 Array of Rows 的形式返回结果,而不是 Long、String 数据类型。在数据框中,列有自己的类型,例如整数、字符串,但它们不会暴露给您。对你来说,它是任何类型。 要将 Row 数据转换为合适的类型,您必须使用 .asInstanceOf 方法。

例如:在 Scala 中:

scala > :type df.collect()
Array[org.apache.spark.sql.Row]


df.collect().map{ row => 
    val str = row(0).asInstanceOf[String]
    val num = row(1).asInstanceOf[Long]
}                      

【讨论】:

    【解决方案3】:

    喜欢榜样的人,这里是:

    1. 创建示例员工数据
     case class Employ(name: String, age: Int, id: Int, department: String)
    
    val empData = Seq(Employ("A", 24, 132, "HR"), Employ("B", 26, 131, "Engineering"), Employ("C", 25, 135, "Data Science"))
    
    1. 创建数据框和数据集数据

      val empRDD = spark.sparkContext.makeRDD(empData)
      val empDataFrame = empRDD.toDf()
      val empDataset = empRDD.toDS()
      

    让我们执行一个操作:

    数据集

    val empDatasetResult = empDataset.filter(employ => employ.age > 24)
    

    数据框

        val empDatasetResult = empDataframe.filter(employ => employ.age > 24)
    

    //出现错误“值age不是org.apache.spark.sql.Row对象的成员。”

    对于 Dataframe,当我们执行 lambda 时,它返回一个 Row 对象而不是 Integer 对象,因此您不能直接执行 employ.age > 24 ,但您可以执行以下操作:

    val empDataFrameResult = empDataFrame.filter(employ => employ.getAs[Int]("age") > 24)
    

    为什么数据集那么特别?

    • 开发劳动少 不需要知道数据的数据类型 执行操作。

    谁不喜欢样板代码?让我们使用数据集创建它..

    感谢:https://blog.knoldus.com/spark-type-safety-in-dataset-vs-dataframe/

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2012-05-07
      相关资源
      最近更新 更多