package Ġnl . j ol an ren sen . efficient ly Discover ing T ernary L agged Corre lations Ċ Ċ import Ġnl . j ol an ren sen . scala Tuples In Kotlin . tuple Of Ċ import Ġnl . j ol an ren sen . the sis . aggregate ByKey Ċ import Ġnl . j ol an ren sen . the sis . map Partitions To Pair K Ċ import Ġorg . apache . spark . api . java . Java RDD Ċ import Ġorg . apache . spark . api . java . Java Spark Context Ċ import Ġorg . apache . spark . api . java . function . Function 2 Ċ import Ġorg . apache . spark . sql . Dataset Ċ import Ġorg . jetbrains . kotlin x . spark . api .* Ċ import Ġscala . Tuple 2 Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Int Stream Ċ import Ġkotlin . math . pow Ċ Ċ object ĠGroup Calculation Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Ġmethod Ġto Ġgive Ġeach Ġindex Ġof Ġx Ġdimensions Ġa Ġunique Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġindex Tuple Ġint [] Ġ( or Ġtuple ) Ġof Ġsize Ġx Ġwith Ġall Ġvalues Ġ< Ġlist Size . ĠThe Ġindex Ġfor Ġwhich Ġto Ġreturn Ġthe Ġnumber ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Size ĠĠ Ġthe Ġsize Ġof Ġthe Ġlist , Ġa ka Ġthe Ġmax Ġwidth , Ġheight Ġetc Ġof Ġthe Ġtable ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġunique Ġnumber Ġfor Ġthis Ġ` index Tuple ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Tuple Value ( index Tuple : ĠInt Array , Ġlist Size : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Tuple . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġindex Tuple [ i ] Ġ* Ġlist Size . toDouble (). pow ( i . toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġmake Ġsure Ġthat Ġevery Ġtuple Ġis Ġonly Ġpicked Ġonce , Ġthis Ġmethod Ġreturns Ġtrue Ġonly Ġif Ġthe Ġindices Ġare Ġin Ġthe Ġright ĊĠĠĠĠ Ġ* Ġcorner Ġof Ġthe Ġmatrix . ĠThis Ġworks Ġfor Ġany Ġnumber Ġof Ġdimensions Ġ> Ġ 1 . ĠHere Ġis Ġan Ġexample Ġfor Ġ 2 - D : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠĠ 0 ĠĠ 1 ĠĠ 2 ĠĠ 3 ĠĠ 4 ĠĠ 5 ĠĠ 6 ĠĠ 7 ĠĠ 8 ĠĠ 9 ĊĠĠĠĠ Ġ* Ġ-------------------------------- ĊĠĠĠĠ Ġ* Ġ 0 | Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 1 | Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 2 | Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 3 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 4 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 5 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 6 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 7 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 8 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġâľĵ ĊĠĠĠĠ Ġ* Ġ 9 | Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx Ġ Ġx ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġindex Tuple Ġa Ġtuple Ġof Ġindices Ġin Ġthe Ġform Ġof Ġan Ġint [] ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġtuple Ġis Ġin Ġthe Ġright Ġcorner Ġand Ġshould Ġbe Ġincluded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠisValid Index Tuple ( index Tuple : ĠInt Array ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġx Ġ- Ġy Ġ> Ġ 0 Ġ Ġ// Ġ 2 d ĊĠĠĠĠĠĠĠ Ġ// Ġ( x Ġ- Ġy ) Ġ> Ġ 0 Ġ&& Ġ( x Ġ- Ġz ) Ġ> Ġ 0 Ġ&& Ġ( y Ġ- Ġz ) Ġ> Ġ 0 ; Ġ Ġ// Ġ 3 d ĊĠĠĠĠĠĠĠ Ġ// Ġ( x Ġ- Ġy ) Ġ> Ġ 0 Ġ&& Ġ( x Ġ- Ġz ) Ġ> Ġ 0 Ġ&& Ġ( x Ġ- Ġa ) Ġ> Ġ 0 Ġ&& Ġ( y Ġ- Ġz ) Ġ> Ġ 0 Ġ Ġ&& Ġ( y Ġ- Ġa ) Ġ> Ġ 0 Ġ&& Ġ( z Ġ- Ġa ) Ġ> Ġ 0 Ġ Ġ// Ġ 4 d ĊĠĠĠĠĠĠĠ Ġrequire ( index Tuple . size Ġ>= Ġ 2 ) Ġ{ Ġ" not Ġa Ġtuple " Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġindex Tuple . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġ+ Ġ 1 Ġuntil Ġindex Tuple . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Tuple [ i ] Ġ- Ġindex Tuple [ j ] Ġ<= Ġ 0 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecursive Ġmethod Ġthat Ġfor Ġ` skip Dimension ` Ġloops Ġover Ġall Ġthe Ġother Ġdimensions Ġand Ġstores ĊĠĠĠĠ Ġ* Ġin Ġ` key Values ` Ġall Ġresults Ġfrom Ġ` get Tuple Value ` Ġas Ġkey Ġand Ġ` value ` Ġas Ġvalue . ĊĠĠĠĠ Ġ* ĠIn Ġthe Ġend , Ġ` key Values ` Ġwill Ġhave , Ġfor Ġeach Ġkey Ġin Ġthe Ġtable Ġbelow , Ġa Ġvalue Ġfor Ġthe Ġkey 's Ġcolumn , Ġrow Ġetc . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġan Ġexample Ġfor Ġ 2 D . ĠThe Ġletters Ġwill Ġbe Ġint Ġindices Ġas Ġwell Ġ( a Ġ= Ġ 0 , Ġb Ġ= Ġ 1 , Ġ..., Ġ` list Size `), Ġbut Ġhelp Ġfor Ġclar ification . ĊĠĠĠĠ Ġ* ĠThe Ġnumbers Ġwe Ġdon 't Ġwant Ġare Ġfiltered Ġout Ġusing Ġ` isValid Index Tuple `. ĊĠĠĠĠ Ġ* ĠThe Ġactual Ġvalue Ġof Ġthe Ġnumber Ġin Ġthe Ġtable Ġcomes Ġfrom Ġ` get Tuple Value `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġ Ġa Ġ Ġb Ġ Ġc Ġ Ġd Ġ Ġe Ġ Ġf Ġ Ġg Ġ Ġh Ġ Ġi Ġ Ġj ĊĠĠĠĠ Ġ* Ġ-------------------------------- ĊĠĠĠĠ Ġ* Ġa | Ġ- ĠĠ 1 ĠĠ 2 ĠĠ 3 ĠĠ 4 ĠĠ 5 ĠĠ 6 ĠĠ 7 ĠĠ 8 ĠĠ 9 ĊĠĠĠĠ Ġ* Ġb | Ġ- Ġ Ġ- Ġ 1 2 Ġ 1 3 Ġ 1 4 Ġ 1 5 Ġ 1 6 Ġ 1 7 Ġ 1 8 Ġ 1 9 ĊĠĠĠĠ Ġ* Ġc | Ġ- Ġ Ġ- Ġ Ġ- Ġ 2 3 Ġ 2 4 Ġ 2 5 Ġ 2 6 Ġ 2 7 Ġ 2 8 Ġ 2 9 ĊĠĠĠĠ Ġ* Ġd | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 3 4 Ġ 3 5 Ġ 3 6 Ġ 3 7 Ġ 3 8 Ġ 3 9 ĊĠĠĠĠ Ġ* Ġe | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 4 5 Ġ 4 6 Ġ 4 7 Ġ 4 8 Ġ 4 9 ĊĠĠĠĠ Ġ* Ġf | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 5 6 Ġ 5 7 Ġ 5 8 Ġ 5 9 ĊĠĠĠĠ Ġ* Ġg | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 6 7 Ġ 6 8 Ġ 6 9 ĊĠĠĠĠ Ġ* Ġh | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 7 8 Ġ 7 9 ĊĠĠĠĠ Ġ* Ġi | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ 8 9 ĊĠĠĠĠ Ġ* Ġj | Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- Ġ Ġ- ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgroup Size ĠĠĠĠĠĠĠ Ġthe Ġsize Ġof Ġindex Ġtuples Ġto Ġform ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Values ĠĠĠĠĠĠĠ Ġthe ĠArrayList Ġin Ġwhich Ġto Ġstore Ġthe Ġkey - value Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġcurrent Ġindex Ġto Ġwork Ġfrom Ġ( can Ġbe Ġseen Ġas Ġa Ġletter Ġin Ġthe Ġtable Ġabove ) ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Size ĠĠĠĠĠĠĠĠ Ġthe Ġsize Ġof Ġthe Ġlist Ġto Ġmake ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Dimension Ġthe Ġindicator Ġfor Ġwhich Ġdimension Ġwe 're Ġcurrently Ġcalculating Ġfor Ġ( and Ġhow Ġdeep Ġin Ġthe Ġrecursion Ġwe Ġare ) ĊĠĠĠĠ Ġ* Ġ@ param Ġindex Tuple ĠĠĠĠĠĠ Ġthe Ġarray Ġ( or Ġtuple ) Ġin Ġwhich Ġto Ġstore Ġthe Ġcurrent Ġindices ĊĠĠĠĠ Ġ* Ġ@ param Ġskip Dimension ĠĠĠ Ġthe Ġcurrent Ġdimension Ġthat Ġwill Ġhave Ġa Ġset Ġvalue Ġ` value ` Ġwhile Ġlooping Ġover Ġthe Ġother Ġdimensions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Tuples ( ĊĠĠĠĠĠĠĠ Ġgroup Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġkey Values : ĠArrayList < Tuple 2 < Int , ĠInt >>, ĊĠĠĠĠĠĠĠ Ġvalue : ĠInt , ĊĠĠĠĠĠĠĠ Ġlist Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġcurrent Dimension : ĠInt , ĊĠĠĠĠĠĠĠ Ġindex Tuple : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġskip Dimension : ĠInt , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Dimension Ġ>= Ġgroup Size ) Ġ{ Ġ Ġ// Ġbase Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid Index Tuple ( index Tuple )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Values Ġ+= Ġtuple Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġget Tuple Value ( index Tuple , Ġlist Size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Dimension Ġ== Ġskip Dimension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Tuple [ current Dimension ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tuples ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size Ġ= Ġgroup Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Values Ġ= Ġkey Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Size Ġ= Ġlist Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dimension Ġ= Ġcurrent Dimension Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Tuple Ġ= Ġindex Tuple , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Dimension Ġ= Ġskip Dimension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlist Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Tuple [ current Dimension ] Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tuples ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size Ġ= Ġgroup Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Values Ġ= Ġkey Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Size Ġ= Ġlist Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dimension Ġ= Ġcurrent Dimension Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Tuple Ġ= Ġindex Tuple , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Dimension Ġ= Ġskip Dimension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Ġhelper Ġfunction Ġto Ġget Ġa Ġfilled Ġint [] Ġof Ġspecified Ġsize Ġand Ġfill Value ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsize ĠĠĠĠĠ Ġthe Ġsize Ġof Ġthe Ġint Ġarray ĊĠĠĠĠ Ġ* Ġ@ param Ġfill Value Ġthe Ġvalue Ġwith Ġwhich Ġto Ġfill Ġup Ġthe Ġarray ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġarray ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Filled IntArray ( size : ĠInt , Ġfill Value : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠInt Array ( size ) ĊĠĠĠĠĠĠĠ ĠArrays . fill ( array , Ġfill Value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġarray ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġthe Ġpossible , Ġunique , Ġnon Ġrepe ating Ġgroups Ġ( of Ġsize Ġ` group Size `) Ġof Ġindices Ġfor Ġa Ġlist Ġof ĊĠĠĠĠ Ġ* Ġsize Ġ` list Size `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworkload Ġis Ġeven ly Ġdistributed Ġby ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Size Ġ Ġthe Ġsize Ġof Ġthe Ġlist Ġfor Ġwhich Ġto Ġcalculate Ġthe Ġindices ĊĠĠĠĠ Ġ* Ġ@ param Ġgroup Size Ġthe Ġsize Ġof Ġa Ġgroup Ġof Ġindices ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġthe Ġpossible , Ġunique Ġnon Ġrepe ating Ġgroups Ġof Ġindices ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠK Spark Session . getAll Possible Groups ( ĊĠĠĠĠĠĠĠ Ġlist Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġgroup Size : ĠInt , ĊĠĠĠ Ġ): ĠDataset < IntArray > Ġ= Ġspark . getAll Possible Groups ( list Size Ġ= Ġlist Size , Ġgroup Size Ġ= Ġgroup Size ) ĊĊĠĠĠ Ġ@ Jvm Name (" getAll Possible Groups Java ") ĊĠĠĠ Ġfun ĠgetAll Possible Groups ( ĊĠĠĠĠĠĠĠ Ġspark : ĠSpark Session , ĊĠĠĠĠĠĠĠ Ġlist Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġgroup Size : ĠInt , ĊĠĠĠ Ġ): ĠDataset < IntArray > Ġ= Ġspark . getAll Possible Groups ( list Size Ġ= Ġlist Size , Ġgroup Size Ġ= Ġgroup Size ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġthe Ġpossible , Ġunique , Ġnon Ġrepe ating Ġgroups Ġ( of Ġsize Ġ` group Size `) Ġof Ġindices Ġfor Ġa Ġlist Ġof ĊĠĠĠĠ Ġ* Ġsize Ġ` list Size `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġworkload Ġis Ġeven ly Ġdistributed Ġby ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Size Ġ Ġthe Ġsize Ġof Ġthe Ġlist Ġfor Ġwhich Ġto Ġcalculate Ġthe Ġindices ĊĠĠĠĠ Ġ* Ġ@ param Ġgroup Size Ġthe Ġsize Ġof Ġa Ġgroup Ġof Ġindices ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġthe Ġpossible , Ġunique Ġnon Ġrepe ating Ġgroups Ġof Ġindices ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠSpark Session . getAll Possible Groups ( ĊĠĠĠĠĠĠĠ Ġlist Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġgroup Size : ĠInt , ĊĠĠĠ Ġ): ĠDataset < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsc Ġ= ĠJava Spark Context ( spark Context ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Size Ġ= Ġbroadcast ( list Size ) ĊĠĠĠĠĠĠĠ Ġval Ġbroadcast Group Size Ġ= Ġbroadcast ( group Size ) ĊĠĠĠĠĠĠĠ Ġval Ġindices Ġ= Ġsc . par alle lize ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt Stream . range ( 0 , Ġlist Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. boxed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġa Ġgroup size Ġof Ġ 1 , Ġno Ġpair ing Ġup Ġis Ġneeded , Ġso Ġjust Ġreturn Ġthe Ġindices Ġconverted Ġto Ġint [] ' s ĊĠĠĠĠĠĠĠ Ġif Ġ( group Size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Dataset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Partitions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < IntArray >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġint ArrayOf ( it . next () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. rdd (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoder (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Red undant Sam Constructor ") ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Partitions To Pair K < Int , ĠJava RDD < Int >, ĠInt , ĠInt > Ġ{ Ġ// Ġthis Ġconverts Ġall Ġindices Ġof Ġstock s Ġto Ġ( number Ġin Ġtable , Ġindex Ġof Ġstock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Value Ġ= Ġbroadcast Size . value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Size Value Ġ= Ġbroadcast Group Size . value () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkey Ġis Ġkey Ġ( item Ġin Ġtable ), Ġvalue Ġis Ġindex Ġin Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Values Ġ= ĠArrayList < Tuple 2 < Int , ĠInt >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Index Ġ= Ġit . next () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġeach Ġdimension Ġloop Ġover Ġthe Ġother Ġdimensions Ġusing Ġadd Tuples ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dimension Ġin Ġ 0 Ġuntil Ġgroup Size Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tuples ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size Ġ= Ġgroup Size Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Values Ġ= Ġkey Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġlist Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Size Ġ= Ġsize Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dimension Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Tuple Ġ= ĠInt Array ( group Size Value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Dimension Ġ= Ġdimension , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Values . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġall Possible Groups Ġ= Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. aggregate ByKey ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġeach Ġnumber Ġin Ġtable Ġoccurs Ġfor Ġeach Ġdimension Ġas Ġkey . ĠThe Ġvalues Ġof Ġthose Ġtwo Ġwill Ġbe Ġa Ġtuple Ġof Ġ( key , Ġstock Ġindices Ġas Ġlist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġa Ġnew Ġint Ġarray Ġto Ġfill Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzero Value Ġ= Ġget Filled IntArray ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġgroup Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Value Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Function Ġ= Ġ{ Ġbase : ĠInt Array , Ġlist Index : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġput Ġlist Index Ġin Ġthe Ġfirst Ġempty Ġspot Ġin Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbase . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base [ i ] Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase [ i ] Ġ= Ġlist Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhow Ġto Ġmerge Ġpartially Ġfilled Ġup Ġint Ġarrays ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine Function Ġ= Ġ{ Ġa : ĠInt Array , Ġb : ĠInt Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmerge Ġa Ġand Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġa . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a [ i ] Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( b [ j ] Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Ġ== Ġb . size ) Ġreturn @ aggregate ByKey Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa [ i ] Ġ= Ġb [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. values () Ġ// Ġfinally Ġjust Ġtake Ġthe Ġvalues ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Dataset ( all Possible Groups . rdd (), Ġencoder ()) ĊĠĠĠ Ġ} Ċ }