2017-12-28 13 views
1

私は2つのSparkデータフレームを持っています。後で参加して選択します。私は、データフレームの1つの特定の列を選択したいと思います。しかし、同じ列名が他の列名に存在します。したがって、私はあいまいな列の例外を取得しています。同じ列のデータセットを結合して1つを選択する方法は?

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

あなたは_言ったとき、「それは動作しません。」_、エラー/例外は何ですか? –

答えて

0

お使いのスパークバージョンはありますか?データフレームのサンプルを置くことはできますか? これを試してみてください。

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

私は解決策ではなく、回避策と呼んでいます。 –

1

火花が2つのデータフレームの列を組み合わせたとき、それはあなたのためのすべての自動名前変更を行いませんので、これは起こります。参加する前に列の名前を変更するだけです。スパークはこのための方法を提供します。結合後、名前を変更した列を削除できます。

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

うん、タイプミス。私は不足している等価物を修正した。また、受け入れられた回答は、投稿後にこれと一致するように編集されました。 – RyanW

0

私は私が参加し、その後選択しています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) 

を持っています。 データフレームの1つの特定の列を選択したいとします。しかし、同じ列名が他の列名に存在します。

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 
関連する問題