我有以下表(每个表也有其他列,但这里不需要)
项目表
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,它表示它是一个子用户。
优先级表
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优先级、.)然后更改优先级,以反映该父级及其所有子级的最大值(如下更新的表中所述)。
优先级表
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查询来完成这个任务。
发布于 2019-11-22 05:56:00
我的解决办法是基于以下几点。
1)基于item和party_id的priority表和user_id表的连接。
2)将空parent_user_id替换为它的user_id (这很神奇)
( 3) **必要时删除不必要的列。
4)应用窗口函数,在party_id中寻找最大优先级。
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)结果
+-------+--------+--------------+--------+------------+
|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以更多的功能方式实现。
https://stackoverflow.com/questions/58986826
复制相似问题