เข้าร่วม DataFrames สองอันใน Spark SQL และเลือกคอลัมน์เดียวเท่านั้น

ฉันมี DataFrames สองอันใน Spark SQL (D1 และ D2)

ฉันกำลังพยายามรวมทั้งสองอย่างเข้าด้วยกัน D1.join(D2, "some column") และรับข้อมูลกลับ เฉพาะ D1 เท่านั้น ไม่ใช่ชุดข้อมูลทั้งหมด

ทั้ง D1 และ D2 มีคอลัมน์เดียวกัน

ใครก็ได้โปรดช่วยฉันในเรื่องนี้ได้ไหม

ฉันใช้ Spark 1.6


person Avi    schedule 02.08.2016    source แหล่งที่มา


คำตอบ (4)


สมมติว่าคุณต้องการเข้าร่วมในคอลัมน์ "id" จากนั้นคุณสามารถเขียน:

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
สวัสดี คำตอบนี้ช่วยได้ ฉันมีคำถามโง่ๆ เครื่องหมาย $ หมายถึงอะไร? ฉันได้รับข้อผิดพลาดเมื่อฉันพยายามเขียนเครื่องหมาย $ ในโค้ดของฉัน - person Avi; 02.08.2016
comment
เป็นอีกทางเลือกหนึ่งในการเข้าถึงคอลัมน์ DataFrame ตามที่อธิบายไว้ ที่นี่ แต่คุณต้องนำเข้าแพ็คเกจโดยนัย (ฉันได้แก้ไขคำตอบแล้ว) - person cheseaux; 02.08.2016
comment
มีตัวเลือกการเข้าร่วมแบบกึ่งซ้ายเช่นกัน ประกอบด้วยแถวจากตารางด้านซ้ายซึ่งมีแถวที่ตรงกันทางด้านขวา และไม่จำเป็นต้องลบข้อมูลซ้ำเนื่องจากแถวที่ตรงกันจะรวมไว้เพียงครั้งเดียว - person user238607; 02.10.2017

เพื่อเป็นคำตอบอื่น คุณสามารถทำสิ่งต่อไปนี้ได้โดยไม่ต้องเพิ่มนามแฝง:

d1.join(d2, d1("id") === d2("id"))
  .select(d1.columns.map(c => d1(c)): _*)
person nsanglar    schedule 30.01.2018
comment
สวัสดี @nsanglar ขอบคุณ สิ่งนี้มีประโยชน์มาก อย่างไรก็ตาม หากฉันมีคอลัมน์ที่ได้รับเช่น .withColumn("derived_id", coalesce(d2("id"),d1("id"))) และฉันต้องการคอลัมน์นี้พร้อมกับคอลัมน์ทั้งหมดของ d1 ฉันจะแก้ไขคำสั่ง select ได้อย่างไร - person riyaB; 04.06.2020

คุณสามารถใช้ left_semi:

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

Semi-join รับเฉพาะแถวจากชุดข้อมูลด้านซ้ายที่ตรงตามเงื่อนไขการเข้าร่วม

นอกจากนี้ยังมีประเภทการรวมที่น่าสนใจอีกประเภทหนึ่ง: left_anti ซึ่งทำงานคล้ายกับ left_semi แต่รับเฉพาะแถวที่ตรงตามเงื่อนไข ไม่

person Krzysztof Atłasik    schedule 30.05.2019

คุณควรใช้การรวม leftsemi ซึ่งคล้ายกับผลต่างการรวมภายใน เนื่องจากการรวม leftsemi จะส่งคืนคอลัมน์ทั้งหมดจากชุดข้อมูลด้านซ้าย และละเว้นคอลัมน์ทั้งหมดจากชุดข้อมูลที่ถูกต้อง

คุณสามารถลองทำสิ่งที่คล้ายกันด้านล่างใน Scala เพื่อ เข้าร่วม Spark DataFrame โดยใช้ leftsemi เข้าร่วมประเภท

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

หากคุณใช้ Python ให้ใช้ตัวอย่าง PySpark join dataframe ด้านล่าง

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