当 Apache spark 具有惰性评估时,数据集 运行 在编译时如何
how does dataset run at compile time, when Apache spark has lazy evaluation
我可以看到 Dataset 会在编译期间告诉您该列是否存在。
如果 Spark 有惰性求值,
在 运行 时间 运行 的操作命令之前,它如何获取数据的模式。
如果我的上述理解有误,请告诉我。
运行时和编译时是有区别的。运行时是惰性评估。 (Spark 不会将数据填充到设计的 类 中,直到它必须这样做。)
在编译时,由于强类型,spark 可以检测数据是否与您提供的“必须”匹配列的 类 匹配。这不会阻止您输入可能会导致运行时错误的“string SQL”。 (这实际上就是为什么不鼓励使用“String SQL”并鼓励以编程方式访问数据集的原因。)
example 创建数据集的典型方式:
case class Person (name: String, age: Long)
val ds = spark.read.json("/databricks-datasets/samples/people/people.json").as[Person]
上面示例中的 ds
没有出现强类型,但确实如此。您必须像 Person
数据集一样与 ds
进行交互。编译器可以确保你这样做,并强制执行使你符合 Person Class 的编码实践。弱类型语言无法做到这一点,因为它无法推断类型。 Scala/Spark 看起来是弱类型的,因为它使用了很多推理,但这些推理是强执行的。
我可以看到 Dataset 会在编译期间告诉您该列是否存在。 如果 Spark 有惰性求值, 在 运行 时间 运行 的操作命令之前,它如何获取数据的模式。
如果我的上述理解有误,请告诉我。
运行时和编译时是有区别的。运行时是惰性评估。 (Spark 不会将数据填充到设计的 类 中,直到它必须这样做。)
在编译时,由于强类型,spark 可以检测数据是否与您提供的“必须”匹配列的 类 匹配。这不会阻止您输入可能会导致运行时错误的“string SQL”。 (这实际上就是为什么不鼓励使用“String SQL”并鼓励以编程方式访问数据集的原因。)
example 创建数据集的典型方式:
case class Person (name: String, age: Long)
val ds = spark.read.json("/databricks-datasets/samples/people/people.json").as[Person]
上面示例中的 ds
没有出现强类型,但确实如此。您必须像 Person
数据集一样与 ds
进行交互。编译器可以确保你这样做,并强制执行使你符合 Person Class 的编码实践。弱类型语言无法做到这一点,因为它无法推断类型。 Scala/Spark 看起来是弱类型的,因为它使用了很多推理,但这些推理是强执行的。