spark 計算訂單中所有商品是否屬於套包

2021-10-09 12:14:47 字數 1888 閱讀 5275

計算訂單中,所包含的商品(單品)是否可以組成套包,且得出這個套包在這個訂單中的個數。

即:假設某套包的商品為(a,b,c),某訂單中購買了(a,b,c,d,a,b,c)五個商品,則這個訂單中包含2個這個套包。

之前是將套包維度表和訂單事實表進行笛卡爾積,然後用hive的udf函式計算,但是在實際使用過程中發現速度很慢。了解到spark 2.0之後的第二代鎢絲計畫對spark內部函式進行了大量優化,可能性能會比hive的udf函式好點。考慮進行重構,使用spark的udf函式進行計算。再此之前先使用df的map運算元進行計算。

經過處理的訂單表內容包含訂單id欄位和購買商品字段,購買商品字段包含該訂單所買的所有商品,以逗號隔開,內容大致如下:

order_id           order_items

1                  a,b,c,d,a,b,c,d

2                  q,w,e,r

3                  a,a,s,d,f

套包維度表與訂單表相同,包含套包id和套包內商品:

head_id         head_items    

1                  a,b,c,d

2                  q,w,e

3                  q,a,s,d

總的來說,這個需求就是求陣列a是否包含陣列b,並求出包含幾個陣列b的問題。將訂單表和套包維度表笛卡爾積。

對笛卡爾積的每條資料進行計算。

將兩張表的items已逗號分隔,轉換成arraybuffer。

判斷order的items個數是否大於head的items個數,如果大於或等於,進入3;否則不可能包含head的套包,結束。

迴圈判斷head的每個item是否存在order的items中,如果存在,則刪除order中的該item,並繼續判斷,直到head的最後乙個item也存在order中,則count加1,並返回2;如果不存在,則說明order中不可能包含head的所有商品,結束。

1.定義樣例類。

package com.zixuan.spark.bean

case class hd(hid:string,hitem:string)

case class order(oid:string,oitem:string)

case class result(hid:string,hitem:string,oid:string,oitem:string,result: int)

2.spark**

package com.zixuan.spark.test

import com.zixuan.spark.bean.

import org.apache.spark.sql.sparksession

import org.apache.spark.

object bomcount

}else })

}//返回result

result(row.getstring(0), row.getstring(1), row.getstring(2), row.getstring(3), count)})

result.show()

}}

3.結果

笛卡爾積的結果:

計算後的結果:

自動計算頂點緩衝中所有頂點的法線

問題 當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量...

自動計算頂點緩衝中所有頂點的法線

當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量 換句...

遍歷html中所有DOM節點,並計算DOM節點數

這是乙個我在面試中遇到的問題,之前從來沒有想過這個問題,所以一被問就卡住了,當然結果也就是涼涼了 所以下來查了一下這個問題,並做以記錄警戒自己 定義乙個空陣列,存放或者取出製表位 t var blanks 遍歷的函式主體 function getchildren parent blanks.pop ...