如何加入具有相同列的数据集并选择一个?

Kra*_*tos 5 scala join apache-spark apache-spark-sql

我有两个 Spark 数据帧,我将加入并在之后进行选择。我想选择其中一个数据框的特定列。但在另一个中存在相同的列名。因此,我收到了歧义列的异常。

我试过这个:

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left").select($"d1.columnName")
Run Code Online (Sandbox Code Playgroud)

和这个:

d1.join(d2, d1("id") === d2("id"), "left").select($"d1.columnName")
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

Jac*_*ski 6

我有两个数据框

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)
Run Code Online (Sandbox Code Playgroud)

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

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

正如你所看到的,它确实有效。


那么,为什么它对你不起作用呢?我们逐一分析一下。

// 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")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


fir*_*sni 5

您使用的是哪个 Spark 版本?你能放一个你的数据框样本吗?尝试这个:

d2prim = d2.withColumnRenamed("columnName", d2_columnName)   
d1.join(d2prim , Seq("id"), "left_outer").select("columnName")
Run Code Online (Sandbox Code Playgroud)