如何使用相同的列加入数据集并选择一个



我有两个Spark DataFrames,然后我将加入并选择它们。我想选择其中一个数据框的特定列。但是另一个名称存在于另一个名称。因此,我有一个模棱两可的列例外。

我尝试了以下方法:

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left").select($"d1.columnName")

和此:

d1.join(d2, d1("id") === d2("id"), "left").select($"d1.columnName")

但它行不通。

我有两个dataframes

val d1 = spark.range(3).withColumn("columnName", lit("d1"))
scala> d1.printSchema
root
 |-- id: long (nullable = false)
 |-- columnName: string (nullable = false)
val d2 = spark.range(3).withColumn("columnName", lit("d2"))
scala> d2.printSchema
root
 |-- id: long (nullable = false)
 |-- columnName: string (nullable = false)

我将加入并选择之后。 我想选择其中一个数据框的特定列。但是另一个列的名称存在。

val q1 = d1.as("d1")
  .join(d2.as("d2"), Seq("id"), "left")
  .select("d1.columnName")
scala> q1.show
+----------+
|columnName|
+----------+
|        d1|
|        d1|
|        d1|
+----------+

您可以看到它只是有效的。


那么,为什么它不适合您?让我们分析每个。

// you started very well
d1.as("d1")
  // but here you used $ to reference a column to join on
  // with column references by their aliases
  // that won't work
  .join(d2.as("d2"), $"d1.id" === $"d2.id", "left")
  // same here
  // $ + aliased columns won't work
  .select($"d1.columnName")

PROTIP :使用d1("columnName")在数据框架中引用特定列。

另一个查询非常接近,但是...

d1.join(d2, d1("id") === d2("id"), "left") // <-- so far so good!
  .select($"d1.columnName") // <-- that's the issue, i.e. $ + aliased column

您正在使用哪个火花版本?您可以放置数据范围的样本吗?尝试以下操作:

d2prim = d2.withColumnRenamed("columnName", d2_columnName)   
d1.join(d2prim , Seq("id"), "left_outer").select("columnName")

发生这种情况,因为当Spark结合了两个数据范围的列时,它不会为您提供任何自动重命名。您只需要在加入之前重命名其中一个列即可。Spark为此提供了一种方法。加入后,您可以放下更名的列。

val df2join = df2.withColumnRenamed("id", "join_id")
val joined = df1.join(df2, $"id" === $"join_id", "left").drop("join_id")

相关内容

  • 没有找到相关文章