다음 테이블이 있습니다 (각 테이블에는 다른 열도 있지만 여기에는 필요하지 않습니다)
아이템 테이블
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
어디 널 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
내가하고 싶은 것은 다음과 같이 우선 순위 테이블을 변환하는 스파크 쿼리를 작성하는 것입니다. 논리는 모든 상위 사용자 및 하위 사용자에 대해 최대 우선 순위 즉, 최대 (상위 사용자 우선 순위, 하위 사용자 1 우선 순위, 하위 사용자 2 우선 순위, ....)를 계산 한 다음 우선 순위를 변경하여 해당 상위 사용자의 최대 값을 반영해야합니다. 및 모든 하위 항목 (아래 업데이트 된 표에 언급 됨).
우선 순위 테이블
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 쿼리를 작성하여 시작하는 방법은 무엇입니까?
내 솔루션은 다음 사항을 기반으로합니다.
1) 가입 item
및 priority
테이블 기반 user_id
및 party_id
.
2) null 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 |
+-------+--------+--------------+--------+------------+
내 솔루션이 매우 효율적인 솔루션이라고는 말할 수 없지만 실행 가능한 솔루션이며 RDD를 사용하여보다 기능적인 방식으로 동일한 결과를 얻을 수도 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다