我有两个Spark数据帧,我正在加入并随后选择。我想选择其中一个Dataframe的特定列。但是另一个列中存在相同的列名。因此,对于含糊不清的专栏,我得到了一个例外。
我试过这个:
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")
但它不起作用。
答案 0 :(得分:2)
这是因为当spark组合来自两个DataFrame的列时,它不会为您执行任何自动重命名。您只需要在加入之前重命名其中一列。 Spark提供了一种方法。加入后,您可以删除重命名的列。
val df2join = df2.withColumnRenamed("id", "join_id")
val joined = df1.join(df2, $"id" === $"join_id", "left").drop("join_id")
答案 1 :(得分:2)
我有两个数据帧
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)
我加入并随后选择。 我想选择其中一个Dataframe的特定列。但是另一个列中存在相同的列名。
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
答案 2 :(得分:1)
你正在使用哪个火花版?你能放一些数据帧样本吗? 试试这个:
d2prim = d2.withColumnRenamed("columnName", d2_columnName)
d1.join(d2prim , Seq("id"), "left_outer").select("columnName")