有没有办法通过两个列表< code>join两个< code > Spark data frame 具有不同的列名?
我知道如果他们在列表中有相同的名字,我可以做以下事情:
val joindf = df1.join(df2, Seq("col_a", "col_b"), "left")
或者,如果我知道不同的列名,我可以这样做:
df1.join(
df2,
df1("col_a") <=> df2("col_x")
&& df1("col_b") <=> df2("col_y"),
"left"
)
由于我的方法需要2个列表的输入,这些列表指定哪些列将用于每个DF的连接
,因此我想知道Scala Spark是否有办法做到这一点?
页(page的缩写)我在寻找类似python的东西< code >熊猫合并:
joindf = pd.merge(df1, df2, left_on = list1, right_on = list2, how = 'left')
如果您需要两个字符串列表:
val leftOn = Seq("col_a", "col_b")
val rightOn = Seq("col_x", "coly")
只需压缩并减少:
import org.apache.spark.sql.functions.col
val on = leftOn.zip(rightOn)
.map { case (x, y) => df1(x) <=> df2(y) }
.reduce(_ and _)
df1.join(df2, on, "left")
您可以自己轻松定义这样的方法:
def merge(left: DataFrame, right: DataFrame, left_on: Seq[String], right_on: Seq[String], how: String) = {
import org.apache.spark.sql.functions.lit
val joinExpr = left_on.zip(right_on).foldLeft(lit(true)) { case (acc, (lkey, rkey)) => acc and (left(lkey) === right(rkey)) }
left.join(right, joinExpr, how)
}
val df1 = Seq((1, "a")).toDF("id1", "n1")
val df2 = Seq((1, "a")).toDF("id2", "n2")
val joindf = merge(df1, df2, left_on = Seq("id1", "n1"), right_on = Seq("id2", "n2"), how = "left")
我有三张桌子: 我想从表1中选择COL1,从表2中选择COL5,从表3中选择COL4 它喜欢两个联接表,但是当我使用以下查询时,它不起作用,COL5是空白的。 请帮忙。 PS我复制了之前的一个类似示例,但输出不同。
问题内容: 我需要比较2个不同数据库中的数据库表,以了解差异所在,是否有一个简单的工具或脚本来实现? 问题答案: redgate SQL数据比较
问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这
我试图用SPARK SQL编写一个查询,执行三个表的联接。但是查询输出实际上是。它适用于单人餐桌。我的联接查询是正确的,因为我已经在oracle数据库中执行了它。我需要在这里附加什么更正?Spark版本是2.0.0。 我在一些网页上发现了下面的说明,但它仍然不起作用:
我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。
我有两个列表和,它们都有元素。 我希望以这样一种方式组合这些元素,即相同索引上的元素聚集在一起,形成以分隔的: 是否有任何方法可以使用Java8直接从2列表本身获得结果列表或字符串 我可以通过使用地图而不是列表来实现这一点。