两个数据集连接后如何自动触发推断数据集?
Posted
技术标签:
【中文标题】两个数据集连接后如何自动触发推断数据集?【英文标题】:How can spark infer dataset automatically after join of two datasets? 【发布时间】:2021-11-24 23:48:13 【问题描述】:spark 是否可以自动推断架构并将 Dataframe 转换为 Dataset 而无需程序员为每个连接创建案例类?
import spark.implicits._
case class DfLeftClass(
id: Long,
name: String,
age: Int
)
val dfLeft = Seq(
(1,"Tim",30),
(2,"John",15),
(3,"Pens",20)
).toDF("id","name", "age").as[DfLeftClass]
case class DfRightClass(
id: Long,
name: String,
age: Int
hobby: String
)
val dfRight = Seq(
(1,"Tim",30,"Swimming"),
(2,"John",15,"Reading"),
(3,"Pens",20,"Programming")
).toDF("id","name", "age", "hobby").as[DfRightClass]
val joined: DataFrame = dfLeft.join(dfRight) // this results in DataFrame instead of a Dataset
【问题讨论】:
【参考方案1】:要留在数据集 API 中,您可以使用 joinWith。这个函数返回一个包含连接两边的元组数据集:
val joined: Dataset[(DfLeftClass, DfRightClass)] = dfLeft.joinWith(dfRight,
dfLeft.col("id").eqNullSafe(dfRight.col("id")))
结果:
+-------------+--------------------------+
|_1 |_2 |
+-------------+--------------------------+
|1, Tim, 30 |1, Tim, 30, Swimming |
|2, John, 15|2, John, 15, Reading |
|3, Pens, 20|3, Pens, 20, Programming|
+-------------+--------------------------+
您可以从这里继续使用元组,也可以将元组映射到第三个案例类。
【讨论】:
不是真的回答,维尔纳。就像有人要奶酪,但你说我们确实有李子。 @thebluephantom 好吧,我认为这是 Spark 提供的最佳答案。我看到的唯一其他选择是切换到 Rows,但 alexSDE 要求提供一种将连接结果保留为数据集而不是数据框的方法。我会认为案例类的元组是数据集的有效类型。 与问题无关,但我很好奇我们如何处理左右连接的空值? @werner。我想你明白我的意思。 @m_vemuri 这取决于实际要求。您可以运行外部联接(左、右或完整)。在这种情况下,元组的一个元素将为空。以上是关于两个数据集连接后如何自动触发推断数据集?的主要内容,如果未能解决你的问题,请参考以下文章