繁体   English   中英

Scala 加入不同的数据集以获取一列的值

[英]Scala join different datasets to get value for one column

我是 Scala 的新手。 我现在有 3 张桌子。

A:

市场 等级 乐队
我们 1级
加州 1级 BAND_1

乙:

市场 等级 价值
我们 1级 10

C:

市场 等级 乐队 价值
加州 1级 BAND_1 20

我想:

对于表 A 中具有市场 = US 的行 -> 在 Seq(Marketplace, Level) 上连接表 B 以获取值;

对于表 A 中具有市场 = CA 的行 -> 在 Seq(Marketplace, Level, Band) 上连接表 C 以获取值。

输出表将如下所示:

市场 等级 乐队 价值
我们 1级 10
加州 1级 BAND_1 20

我应该如何编写 Scala 代码来实现这一点? 谢谢!

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{coalesce, col}
import spark.implicits._
val A = Seq(("US", "LEVEL_1", ""), ("CA", "LEVEL_1", "BAND_1"))
  .toDF("Marketplace", "Level", "Band")
val B = Seq(("US", "LEVEL_1", 10)).toDF("Marketplace", "Level", "Value")
val C = Seq(("CA", "LEVEL_1", "BAND_1", 20)).toDF(
  "Marketplace",
  "Level",
  "Band",
  "Value"
)

val res = A
  .join(B, A.col("Marketplace") === B.col("Marketplace"), "left")
  .join(C, A.col("Marketplace") === C.col("Marketplace"), "left")
  .select(
    A.col("Marketplace").alias("Marketplace"),
    A.col("Level").alias("Level"),
    C.col("Band").alias("Band"),
    coalesce(B.col("Value"), C.col("Value")).alias("Value")
  )

res.show(false)
//    +-----------+-------+------+-----+
//    |Marketplace|Level  |Band  |Value|
//    +-----------+-------+------+-----+
//    |US         |LEVEL_1|null  |10   |
//    |CA         |LEVEL_1|BAND_1|20   |
//    +-----------+-------+------+-----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM