Menggabungkan dua DataFrames di Spark SQL dan memilih hanya satu kolom

Saya memiliki dua DataFrame di Spark SQL (D1 dan D2).

Saya mencoba menggabungkan keduanya D1.join(D2, "some column") dan mendapatkan kembali data hanya D1, bukan kumpulan data lengkap.

Baik D1 dan D2 memiliki kolom yang sama.

Bisakah seseorang membantu saya dalam hal ini?

Saya menggunakan Spark 1.6.


person Avi    schedule 02.08.2016    source sumber


Jawaban (4)


Katakanlah Anda ingin bergabung di kolom "id". Kemudian Anda bisa menulis:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._    
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select($"d1.*")
person cheseaux    schedule 02.08.2016
comment
Hai, Jawaban ini membantu. Saya punya pertanyaan konyol. Apa yang dimaksud dengan tanda $? Saya mendapatkan kesalahan saat mencoba menulis tanda $ di kode saya. - person Avi; 02.08.2016
comment
Ini adalah cara alternatif untuk mengakses kolom DataFrame, seperti yang dijelaskan di sini, tetapi Anda harus mengimpor paket implisit (saya telah mengedit jawaban saya) - person cheseaux; 02.08.2016
comment
Ya, ada opsi gabung setengah kiri juga. Ini mencakup baris dari tabel kiri yang memiliki baris yang cocok di sebelah kanan. Juga tidak perlu melakukan penghapusan karena baris yang cocok hanya disertakan satu kali. - person user238607; 02.10.2017

Sebagai jawaban alternatif, Anda juga bisa melakukan hal berikut tanpa menambahkan alias:

d1.join(d2, d1("id") === d2("id"))
  .select(d1.columns.map(c => d1(c)): _*)
person nsanglar    schedule 30.01.2018
comment
Hai @nsanglar , terima kasih, ini sangat membantu. Namun, jika saya memiliki kolom turunan seperti .withColumn("derived_id", coalesce(d2("id"),d1("id"))) dan saya ingin kolom ini bersama dengan semua kolom d1, lalu bagaimana cara mengubah pernyataan pilih? - person riyaB; 04.06.2020

Anda dapat menggunakan left_semi:

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left_semi")

Semi-join hanya mengambil baris dari kumpulan data kiri yang kondisi penggabungannya terpenuhi.

Ada juga tipe gabungan lain yang menarik: left_anti, yang cara kerjanya mirip dengan left_semi namun hanya mengambil baris yang kondisinya tidak terpenuhi.

person Krzysztof AtÅ‚asik    schedule 30.05.2019

Anda harus menggunakan gabungan leftsemi yang serupa dengan perbedaan gabungan dalam karena gabungan leftsemi mengembalikan semua kolom dari kumpulan data kiri dan mengabaikan semua kolom dari kumpulan data kanan.

Anda dapat mencoba sesuatu seperti di bawah ini di Scala untuk Bergabung dengan Spark DataFrame menggunakan leftsemi tipe gabungan.

empDF.join(deptDF,empDF("emp_dept_id") ===  deptDF("dept_id"),"leftsemi")
    .show(false)

Jika Anda menggunakan Python, gunakan contoh PySpark join dataframe di bawah ini

empDF.join(deptDF,empDF.emp_dept_id ==  deptDF.dept_id,"leftsemi") \
   .show(truncate=False)
person Kumar    schedule 27.10.2020