首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >激发查询以聚合和更新父级子关系的表中的值

激发查询以聚合和更新父级子关系的表中的值
EN

Stack Overflow用户
提问于 2019-11-22 02:57:58
回答 1查看 359关注 0票数 1

我有以下表(每个表也有其他列,但这里不需要)

项目表

代码语言:javascript
复制
      user_id, party_id, parent_user_id
        1,        X,      null
        2,        X,       1
        3,        X,       1
        4,        Z,       null
        5,        Z,       4
        6,        Y,       null
        7,        Y,       6
        8,        Y,       6
        1,        Y,       null

其中null parent_user_id表示它的父用户,然后哪个列有一个parent_user_id,它表示它是一个子用户。

优先级表

代码语言:javascript
复制
      user_id, party_id, priority
          1,      X,     0.3 
          2,      X,     0.8
          3,      X,     0.5 
          4,      Z,     0.1
          5,      Z,     0.2
          6,      Y,     0.7
          7,      Y,     0.4
          8,      Y,     0.5
          1,      Y,     0.3

我想要做的是编写一个火花查询来转换优先级表,如下所示。对于每个父用户和其子用户,逻辑应该计算其最大优先级,即最大优先级(父用户优先级、子user1优先级、子user2优先级、.)然后更改优先级,以反映该父级及其所有子级的最大值(如下更新的表中所述)。

优先级表

代码语言:javascript
复制
      user_id, party_id, priority
          1,      X,     0.8 
          2,      X,     0.8
          3,      X,     0.8 
          4,      Z,     0.2
          5,      Z,     0.2
          6,      Y,     0.7
          7,      Y,     0.7
          8,      Y,     0.7
          1,      Y,     0.3

你怎么写火花作业来完成这个任务?您如何开始首先编写一个基本的sql查询来完成这个任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-22 05:56:00

我的解决办法是基于以下几点。

1)基于itemparty_idpriority表和user_id表的连接。

2)将空parent_user_id替换为它的user_id (这很神奇)

( 3) **必要时删除不必要的列。

4)应用窗口函数,在party_id中寻找最大优先级。

代码语言:javascript
复制
val itemTbl = Seq((1, "X", None),
      (2, "X", Some(1)),
      (3, "X", Some(1)),
      (4, "Z", None),
      (5, "Z", Some(4)),
      (6, "Y", None),
      (7, "Y", Some(6)),
      (8, "Y", Some(6)),
      (1, "Y", None)).toDF("user_id", "party_id", "parent_user_id")


    val priorityTbl = Seq((1, "X", 0.3),
      (2, "X", 0.8),
      (3, "X", 0.5),
      (4, "Z", 0.1),
      (5, "Z", 0.2),
      (6, "Y", 0.7),
      (7, "Y", 0.4),
      (8, "Y", 0.5),
      (1, "Y", 0.3)).toDF("user_id", "party_id", "priority")

  //replace null parent_user_id with actual value in Item table.
    val replaceExp = when(col("parent_user_id") isNull, col("user_id")).otherwise(col("parent_user_id"))
    val itemTblModf = itemTbl.withColumn("parent_user_id", replaceExp)

val windowSpec = Window.partitionBy("party_id", "parent_user_id")
itemTblModf.join(priorityTbl, itemTbl("user_id") <=> priorityTbl("user_id") && itemTbl("party_id") <=> priorityTbl("party_id"))
  .drop(priorityTbl("user_id"))
  .drop(priorityTbl("party_id"))
  .withColumn("new_priority", max("priority") over windowSpec).show(200, false)

结果

代码语言:javascript
复制
+-------+--------+--------------+--------+------------+
|user_id|party_id|parent_user_id|priority|new_priority|
+-------+--------+--------------+--------+------------+
|1      |Y       |1             |0.3     |0.3         |
|1      |X       |1             |0.3     |0.8         |
|2      |X       |1             |0.8     |0.8         |
|3      |X       |1             |0.5     |0.8         |
|4      |Z       |4             |0.1     |0.2         |
|5      |Z       |4             |0.2     |0.2         |
|6      |Y       |6             |0.7     |0.7         |
|7      |Y       |6             |0.4     |0.7         |
|8      |Y       |6             |0.5     |0.7         |
+-------+--------+--------------+--------+------------+

我不会说我的解决方案非常有效,但是它是一个可行的solution.The,同样的结果也可以使用RDD以更多的功能方式实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58986826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档