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

scala中连接数据帧和替换列值

左丘凡
2023-03-14

我正在尝试连接两个apache spark sql DataFrame,并将第一个数据帧的列值替换为另一个。如:

Df1:

col1 | col2  |  other columns .... say (col-x, col-y, col-z)
------------ |--------------------------------
x    |  a    |random values
y    |  b    |random values
z    |  c    |random values

Df2:

col1 | col3  | other columns .. say (col-a, col-b, col-c)
-------------|--------------------------------
x    |  a1   |different random values
y    |  b1   |different random values
w    |  w1   |different random values

resultant dataframe should be

DF:

col1 | col2  | other columns of DF1 (col-x. col-y, col-z)
-------------|-------------------------------
a1   |  a    |random values
b1   |  b    |random values
z    |  c    |random values

我需要执行左连接并将 DF1.col1 的值替换为 DF2.col3,其中 DF1.col1 = DF2.col1。我不知道该怎么做。此外,如上例所示,DF1 除了“col1”和“col2”之外还有更多列,我无法对所有列都应用 select。我正在尝试类似的东西,

val df = df1.join(df2, Seq("col1"), "left").select(
  coalesce(df2("col2"), df1("col1")).as("col1")
)

但这似乎行不通。另外,我认为它会过滤掉DF1的其他列。我想保留 DF1 的所有列。

在Scala中如何做到这一点?

共有2个答案

慕凌龙
2023-03-14

对于连接后从“df1”获取所有列,别名可用于数据帧:

val updatedCol1 = coalesce(df2("col3"), df1("col1")).alias("col1")
val columns = updatedCol1 :: df1.columns
  .filterNot(_ == "col1")
  .map(cname => col("df1." + cname))
  .toList

df1.alias("df1")
  .join(df2, Seq("col1"), "left")
  .select(columns: _*)
夹谷飞龙
2023-03-14

您可以按如下方式构造所需的3列。

val df = df1.join(df2, Seq("col1"), "left").select(coalesce(df2("col3"), df1("col1")).as("col1"),col("col2"), col("colx"))
 类似资料:
  • 我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例

  • 在Apache Spark 2.1.0中,我有两个数据帧aaa_01和aaa_ 02。 我对这两个数据帧执行内部联接,从两个数据帧中选择几个列以显示在输出中。 Join 工作正常,但输出数据帧具有与输入数据帧中存在的列名称相同的列名。我被困在这里。我需要使用新的列名称,而不是在输出数据帧中获取相同的列名称。 下面给出了示例代码供参考 我获取的输出数据帧的列名称为“col1,col2,col3”。我

  • 我想使用Spark和Scala强制转换dataframe的模式以更改某些列的类型。 具体地说,我正在尝试使用AS[U]函数,其描述为:“返回一个新的数据集,其中每个记录都映射到指定的类型。用于映射列的方法取决于U的类型。” 原则上,这正是我想要的,但我不能使它起作用。 下面是一个取自https://github.com/apache/spark/blob/master/sql/core/src/t

  • 我得到以下错误:org.apache.spark.sql.analysisException:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;; 我尝试了多种解决方案来解决这个问题,但似乎没有任何效果。所有的想法都得到了赞赏。谢了!

  • 我有一个如下的CSV文件。 我想把这个转化成下面。 基本上,我想在输出数据帧中创建一个名为idx的新列,该列将填充与键=idx,value=“n”后面的行相同的值“n”。

  • 我有以下数据框: 我想用列创建一个新的数据帧,并从开始连接每两列,因此最终表如下所示: