两个数据集连接后如何自动触发推断数据集?

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 这取决于实际要求。您可以运行外部联接(左、右或完整)。在这种情况下,元组的一个元素将为空。

以上是关于两个数据集连接后如何自动触发推断数据集?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用外键连接两个数据集以创建新数据集?

如何修复两个数据集之间的连接

使用模糊逻辑连接两个数据集

VS2015如何连接mySQL数据库图文

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

如何加入两个镶木地板数据集?