当前位置: 首页 > 知识库问答 >
问题:

当联接列不同时,使用Spark Scala动态联接数据流

袁志专
2023-03-14

在scala spark中连接不同数据帧时动态选择多列

从上面的链接,我能够让连接表达式工作,但如果列名不同,我们不能使用Seq(columns)而需要动态地连接它。这里的left_ds和right_ds是我想加入的数据流。下面我想要连接列id=acc_id和“acc_no=number”

val joinKeys="id,acc_id|acc_no,number"
val joinKeyPair: Array[(String, String)] = joinKeys.split("\\|").map(_.split(",")).map(x => x(0).toUpperCase -> x(1).toUpperCase)

val joinExpr: Column = joinKeyPair.map { case (ltable_col, rtable_col) =>left_ds.col(ltable_col) === right_ds.col(rtable_col)}.reduce(_ and _)

left_ds.join(right_ds, joinExpr, "left_outer")

共有1个答案

庄弘业
2023-03-14

使用别名必须很好地工作:

val conditionArrays = joinKeys.split("\\|").map(c => c.split(","))
val joinExpr = conditionArrays.map { case Array(a, b) => col("a." + a) === col("b." + b) }.reduce(_ and _)
left_ds.alias("a").join(right_ds.alias("b"), joinExpr, "left_outer")
 类似资料:
  • 我有两个数据帧df1(Employee表) 和 在我连接了df1.dept_id和df2.id上的这两个表之后: 同时将其保存在文件中, 它给出错误: 我读过有关使用字符串序列来避免列重复的信息,但这适用于要对其执行连接的列。我需要对未连接的列具有类似的功能。 有没有一种直接的方法可以将重复列嵌入表名以便保存? 我想出了一个解决方案,匹配两个df的列,并重命名重复的列,将表名附加到列名上。但是有直

  • 我想连接两个不同的数据和数据类型相同的表。 在表A中,列col1具有varchar数据类型,即123,而在表B中,列col1具有varchar数据类型,即ABC-123 是否有任何方法通过将ABC作为前缀添加到表1中的col1中,或者通过将前缀ABC从col1表2中移除来连接这两个列。

  • 我正在尝试连接两个数据帧。 我创建了别名并根据这篇文章引用它们:Spark Dataframe区分具有重复名称的列 但是,当它点击<code>fillna()s的信息。 但我一直有这个错误: 下面是连接的输出: 有人可以解释为什么这不起作用吗?我不想创建单独的列,因为它们应该在上加入。

  • 什么是SQL和什么是不同的类型?

  • 嗨,伙计们,我正在使用Laravel5.5,我有两个表,用户和服务 用户表 ID 名称 电子邮件 密码 地址 城市 国家 邮政编码 null 提前谢了。热烈问候:阿卜杜拉·沙希德。

  • 问题内容: 我需要模拟左联接效果而不使用“左联接”键。 我有两个表,A和B,都带有和列。我想在两个表中都选择所有dbid,其中A中的名称等于B中的名称。 我使用它来进行同步,因此B开头是空的(所以我将使用A的id和B的id为null的对)。稍后,我将混合使用值-value和值-null的夫妇。 通常是: 问题是我无法使用,并且想知道是否/如何做同样的事情。 问题答案: 您可以使用这种方法,但是必须