計算訂單中,所包含的商品(單品)是否可以組成套包,且得出這個套包在這個訂單中的個數。
即:假設某套包的商品為(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套包維度表與訂單表相同,包含套包id和套包內商品:1 a,b,c,d,a,b,c,d
2 q,w,e,r
3 a,a,s,d,f
head_id head_items總的來說,這個需求就是求陣列a是否包含陣列b,並求出包含幾個陣列b的問題。將訂單表和套包維度表笛卡爾積。1 a,b,c,d
2 q,w,e
3 q,a,s,d
對笛卡爾積的每條資料進行計算。
將兩張表的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 ...