【问题标题】:Spark DataFrame is Untyped vs DataFrame has schema?Spark DataFrame is Untyped vs DataFrame 有模式?
【发布时间】:2019-02-16 16:41:49
【问题描述】:

我是 Spark 的初学者,在阅读有关 Dataframe 的信息时,我经常发现以下两个关于 dataframe 的语句-

1) DataFrame 是无类型的 2) DataFrame 具有模式(就像数据库表一样,具有与表属性相关的所有信息 - 名称,类型,不为空)

这两个陈述不是相互矛盾的吗?首先我们说 Dataframe 没有类型,同时我们也说 Dataframe 有关于所有列的信息,即模式,请帮助我这里缺少什么?因为如果数据框有模式,那么它也知道列的类型,所以它是如何变成无类型的?

【问题讨论】:

    标签: apache-spark apache-spark-sql bigdata


    【解决方案1】:

    DataFrames 是动态类型的,而 Datasets 和 RDDs 是静态类型的。这意味着当您定义数据集或 RDD 时,您需要显式指定一个表示内容的类。这很有用,因为当您在数据集上编写转换时,编译器可以检查您的代码的类型安全性。以这个宠物信息数据集为例。当我使用pet.speciespet.name 时,编译器在编译时就知道它们的类型。

    case class Pet(name: String, species: String, age: Int, weight: Double)
    
    val data: Dataset[Pet] = Seq(
      Pet("spot", "dog", 2, 50.5),
      Pet("mittens", "cat", 11, 15.5),
      Pet("mickey", "mouse", 1, 1.5)).toDS
    println(data.map(x => x.getClass.getSimpleName).first)
    // Pet
    
    val newDataset: Dataset[String] = data.map(pet => s"I have a ${pet.species} named ${pet.name}.")
    

    当我们切换到使用 DataFrame 时,架构保持不变,数据仍然是类型化的(或结构化的),但此信息仅在运行时可用。这称为动态类型。这可以防止编译器捕获您的错误,但它可能非常有用,因为它允许您编写类似 sql 的语句并动态定义新列,例如将列附加到现有 DataFrame,而无需为每个定义一个新类小手术。另一方面,您可以定义导致空值或在某些情况下导致运行时错误的错误操作。

    val df: DataFrame = data.toDF
    df.printSchema()
    // root
    // |-- name: string (nullable = true)
    // |-- species: string (nullable = true)
    // |-- age: integer (nullable = false)
    // |-- weight: double (nullable = false)
    
    val newDf: DataFrame = df
      .withColumn("some column", ($"age" + $"weight"))
      .withColumn("bad column", ($"name" + $"age"))
    newDf.show()
    // +-------+-------+---+------+-----------+----------+
    // |   name|species|age|weight|some column|bad column|
    // +-------+-------+---+------+-----------+----------+
    // |   spot|    dog|  2|  50.5|       52.5|      null|
    // |mittens|    cat| 11|  15.5|       26.5|      null|
    // | mickey|  mouse|  1|   1.5|        2.5|      null|
    // +-------+-------+---+------+-----------+----------+
    

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2019-07-08
      • 2017-10-18
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多