从Scala中其他2个数据集中的特定列创建新数据集

问题描述 投票:0回答:1

我下面有2个不同模式的数据集。

case class schema1(a: Double, b: Double) -> dataset1
case class schema2(c: Double, d: Double, e: Double, f: Double) -> dataset2

我想使用以下架构创建另一个数据集:

case class schema3(c: Double,  b: Double) -> dataset3

即schema3数据集包含来自模式2数据集的第一列c和来自模式1数据集的第二列b。

我如何通过利用来自数据集2和1的c和b列的数据基于schema3创建第三个数据集。

或更简单地说,我必须通过从第一数据集中获取一列,再从第二数据集中获取另一列,并将其映射到上面定义的第三模式来创建第三数据集。

请帮助。

scala apache-spark apache-spark-dataset
1个回答
0
投票
使用monotonically_increasing_idrow_numer在两个数据集中添加唯一的ID值,并使用id列与两个数据集中的必需列一起加入两个数据集,最后从结果数据集中删除ID。

请检查下面的代码。

scala> case class schema1(a: Double, b: Double) defined class schema1 scala> case class schema2(c: Double, d: Double, e: Double, f: Double) defined class schema2 scala> import org.apache.spark.sql.expressions._ import org.apache.spark.sql.expressions._ scala> val sa = Seq(schema1(11,12),schema1(22,23)).toDF.withColumn("id",monotonically_increasing_id).withColumn("id",row_number().over(Window.orderBy("id"))) sa: org.apache.spark.sql.DataFrame = [a: double, b: double ... 1 more field] scala> val sb = Seq(schema2(22,23,24,25),schema2(32,33,34,35),schema2(132,133,134,135)).toDF.withColumn("id",monotonically_increasing_id).withColumn("id",row_number().over(Window.orderBy("id"))) sb: org.apache.spark.sql.DataFrame = [c: double, d: double ... 3 more fields] scala> sa.show(false) +----+----+---+ |a |b |id | +----+----+---+ |11.0|12.0|0 | |22.0|23.0|1 | +----+----+---+ scala> sb.show(false) +-----+-----+-----+-----+---+ |c |d |e |f |id | +-----+-----+-----+-----+---+ |22.0 |23.0 |24.0 |25.0 |0 | |32.0 |33.0 |34.0 |35.0 |1 | |132.0|133.0|134.0|135.0|2 | +-----+-----+-----+-----+---+ scala> sb.select("c","id").join(sa.select("b","id"),Seq("id"),"full").drop("id").show(false) +-----+----+ |c |b | +-----+----+ |22.0 |12.0| |32.0 |23.0| |132.0|null| +-----+----+

© www.soinside.com 2019 - 2024. All rights reserved.