繁体   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