Spark DataFrame是无类型的,而DataFrame具有模式?

6

我是一个Spark的初学者,在阅读有关Dataframe的内容时,经常会发现以下两个关于Dataframe的语句:

1)Dataframe是无类型的 2)Dataframe有模式(就像数据库表格一样,其中包含所有与表格属性相关的信息-名称、类型、非空等)

这两个语句不是矛盾的吗?首先我们说Dataframe是无类型的,同时我们也说Dataframe有关于所有列的信息,即模式,请帮助我理解这里缺少什么?因为如果Dataframe有模式,那么它也知道列的类型,那么它如何成为无类型的呢?

2个回答

8

数据帧是动态类型的,而数据集和RDD是静态类型的。这意味着当您定义数据集或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|
// +-------+-------+---+------+-----------+----------+

0

Spark 在运行时而不是编译时检查 DataFrame 类型是否与给定模式中的类型对齐。这是因为 DataFrame 中的元素是 Row 类型,而 Row 类型不能在编译时由编译器参数化类型,因此编译器无法检查其类型。因此,DataFrame 是无类型的,也不是类型安全的。

另一方面,数据集在编译时检查类型是否符合规范。这就是为什么数据集是类型安全的原因。

有关更多信息,请参见https://blog.knoldus.com/spark-type-safety-in-dataset-vs-dataframe/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接