我试图弄清楚自己,因为我在任何地方都找不到回应。
让我们有一个数据集,其中包含具有多个字段的案例类:
scala> case class A(x: Int, y: Int)
scala> val dfA = spark.createDataset[A](Seq(A(1, 2)))
scala> val dfX = dfA.map(_.x)
现在,如果我们检查优化计划,我们会得到以下信息:
scala> val plan = dfX.queryExecution.optimizedPlan
SerializeFromObject [input[0, int, true] AS value#8]
+- MapElements <function1>, obj#7: int
+- DeserializeToObject newInstance(class A), obj#6: A
+- LocalRelation [x#2, y#3]
根据更详细plan.toJSON
的DeserializeToObject
步骤,假设x
和y
都存在。
正如您所证明的那样,例如以下代码片段,它使用反射而不是直接接触A
仍然有效的字段。
val dfX = dfA.map(
_.getClass.getMethods.find(_.getName == "x").get.invoke(x).asInstanceOf[Int]
)