簡體   English   中英

將此 sql 左連接查詢轉換為 spark 數據幀(scala)

[英]convert this sql left-join query to spark dataframes (scala)

我有這個 sql 查詢,它是一個左連接,並且在開頭有一個 select 語句,它也從正確的表列中進行選擇..你能幫忙將它轉換為 spark 數據幀並使用 spark-shell 獲得結果嗎? 我不想在 spark 中使用 sql 代碼,而是想使用數據幀。

我知道 scala 中的連接語法,但是當左連接無法訪問右表的列時我不知道如何從正確的表中進行選擇(這里是 count(w.id2))。

謝謝!

select count(x.user_id) user_id_count, count(w.id2) current_id2_count
from
    (select
        user_id
    from
        tb1
    where
        year='2021'
        and month=1
        
    ) x
left join
    (select id1, max(id2) id2 from tb2 group by id1) w
on
    x.user_id=w.id1;

在 spark 中,我會創建兩個數據框 x 和 w 並加入它們:

var x = spark.sqlContext.table("tb1").where("year='2021' and month=1")
var w= spark.sqlContext.table("tb2").groupBy("id1").agg((max("id2").alias("id2"))
var joined = x.join(w, x("user_id")===w("id1"), "left")

您的請求很難理解,但是我將嘗試以您提供的 SQL 代碼為基准進行回復,並使用 Spark 重現它。

// Reading tb1 (x) and filtering for Jan 2021, selecting only "user_id"
val x: DataFrame = spark.read
  .table("tb1")
  .filter(col("year") === "2021")
  .filter(col("mont") === "01")
  .select("user_id")

// Reading tb2 (w) and for each "id1" getting the max "id2"
val w: DataFrame = spark.read
  .table("tb2")
  .groupBy(col("id1"))
  .max("id2")

// Joining tb1 (x) and tb2 (w) on "user_id" === "id1", then counting user_id and id2
val xJoinsW: DataFrame = x
  .join(w, x("user_id") === w("id1"), "left")
  .select(count(col("user_id").as("user_id_count")), count(col("id2").as("current_id2_count")))

一個小而相關的評論,當您使用 Scala 和 Spark 時,我建議您使用val而不是var val表示它是最終的,不能重新分配,而var可以稍后重新分配。 您可以在此處閱讀更多內容。

最后,您可以隨意更改 Spark 讀取機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM