2

私のデータフレームには10,0000列があり、各グループにいくつかのロジックを適用する必要があります(キーは地域と部門です)。各グループは、10k 列から最大 30 列を使用します。30 列のリストは、2 番目のデータ セット列「colList」からのものです。各グループには 2 ~ 300 万行あります。私のアプローチは、キーごとにグループ化し、以下のように関数を呼び出すことです。しかし、それは失敗します - 1.シャッフルし、2.データグループが2Gを超えています(再パーティションで解決できますが、コストがかかります)、3.非常に遅い

def testfunc(iter):
   <<got some complex business logic which cant be done in spark API>>

resRDD = df.rdd.groupBy(region, dept).map(lambda x: testfunc(x))

入力:

region dept week val0 val1  val2  val3 ... val10000   
 US    CS   1     1    2    1     1   ...  2 
 US    CS   2     1.5  2    3     1   ...  2
 US    CS   3     1    2    2     2.1      2
 US    ELE  1     1.1  2    2     2.1      2
 US    ELE  2     2.1  2    2     2.1      2
 US    ELE  3     1    2    1     2   .... 2
 UE    CS   1     2    2    1     2   .... 2

各グループで選択する列: (データセット 2)

region dept colList   
 US    CS   val0,val10,val100,val2000 
 US    ELE  val2,val5,val800,val900
 UE    CS   val21,val54,val806,val9000

私の 2 番目の解決策は、30 列のみの入力データから新しいデータ セットを作成し、列の名前を col1 から col30 に変更することです。次に、列とグループごとにマッピング リストを使用します。次に、10K 列の元の入力よりもスキナーになる groupbyKey (仮定) を適用できます。

region dept week col0 col1  col2  col3 ... col30   
 US    CS   1     1    2    1     1   ...  2 
 US    CS   2     1.5  2    3     1   ...  2
 US    CS   3     1    2    2     2.1      2
 US    ELE  1     1.1  2    2     2.1      2
 US    ELE  2     2.1  2    2     2.1      2
 US    ELE  3     1    2    1     2   .... 2
 UE    CS   1     2    2    1     2   .... 2

10K の入力を 30 列に変換するのに役立つ人はいますか? または、グループ化を避けるために、他の代替手段を使用しても問題ありません。

4

1 に答える 1