【问题标题】:how to create a Dataset of [(Row, Row)]如何创建 [(Row, Row)] 的数据集
【发布时间】:2020-06-24 01:16:24
【问题描述】:

我有一个接收Dataset[(Row, Row)] 的函数,我正在尝试测试这个函数,但我不确定如何创建一个Dataset[(Row, Row)] 的数据集

我尝试了以下方法,但它说这是tuple2[DataFrame, DataFrame] 类型

      val df: Dataset[(Row,Row)] = (
        Seq(
          ("NOW", "active", 1, 11),
          ("BEFORE", "active", 2, 11),
          ("AFTER", "active", 3, 33)
        ).toDF(),
        Seq(
          ("NOW", "sub_uuid1", 1, "com_uuid1"),
          ("BEFORE", "sub_uuid2", 2, "com_uuid2"),
          (null, null, 3, null)
        ).toDF()
      )

我怎样才能把上面的代码写成Dataset[(Row,Row)]

【问题讨论】:

  • 这个函数有什么作用?你可以分享它的源代码吗?在我看来,使用 Row 这样的结构来表示数据集中的一整行似乎很奇怪。
  • @jrook 这一点也不奇怪。 Row 代表一个StructType,可以是结构列或行。

标签: scala apache-spark apache-spark-sql apache-spark-dataset


【解决方案1】:

因为您创建了 Dataset[Row] 的元组:

val ds1: Dataset[Row] = Seq(
          ("NOW", "active", 1, 11),
          ("BEFORE", "active", 2, 11),
          ("AFTER", "active", 3, 33)
        ).toDF()
val ds2: Dataset[Row] = Seq(
          ("NOW", "sub_uuid1", 1, "com_uuid1"),
          ("BEFORE", "sub_uuid2", 2, "com_uuid2"),
          (null, null, 3, null)
        ).toDF()

你只是把它们做成了元组:

val df: (Dataset[Row], Dataset[Row]) = (ds1, ds2)

你可以这样做:

val df: Dataset[(Row, Row)] =
  Seq(
    (Row("NOW", "active", 1, 11), Row("NOW", "sub_uuid1", 1, "com_uuid1")),
    (Row("BEFORE", "active", 2, 11), Row("BEFORE", "sub_uuid2", 2, "com_uuid2")),
    (Row("AFTER", "active", 3, 33), Row(null, null, 3, null))
  ).toDS()

实际上,使用元组行创建数据集是一种不好的做法。如果您可以重写您的函数以采用两个数据帧 (DataFrame: a, DataFrame: b) 而不是 ab: Dataset[(Row, Row)],那就更好了。

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2019-08-09
    • 2019-04-29
    • 1970-01-01
    • 2023-03-24
    • 2019-08-07
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多