5.51. mshuffle レコード分割

f= で指定した項目のhash値に従って指定した数のデータに入力データを分割する。 分割数(hashサイズ)を \(n\) とすると、f=で指定した「項目の値」 \(v\) のhash値は \(n\) の剰余( \(v\) mod \(n\) )として計算される。 「項目の値」は、データを文字列として考え、バイト単位の文字コードの合計値として計算される。 f= を指定しなかった場合は、「項目の値」として行番号が用いられる。 そして、各行は、得られたhash値を名前に持ったデータに出力される。 以上の方法により、同じ項目データを持つ行は全て同一のデータに出力されることが保証される。 また、 v= で重みを指定することで、分割される各データに複数のhash値を割り当てることもできる。 n=3,v=2,1,3 と指定すれば、hashサイズを重みの合計 \(2+1+3=6\) とし、 2つのhash値(0,1)を分割データ0に、1つのhash値(2)を分割データ1に、 そして3つのhash値(3,4,5)を分割データ2に出力する。 重みはhash値の割当数の重みであり、出力行数の重みではないことに注意する。

パラメータ

i= : 型=str , 任意(default=標準入力)

入力データを指定する。

d= : 型=str , 必須

出力するデータの接頭辞を指定する
ここで指定した値+連番(hash値)が実際に出力されるデータになる

f= : 型=str , 任意(default=)

分割単位となるキーを指定する
ここで指定した項目値が等しいものは同じデータに出力される

n= : 型=str , 任意(default=)

分割するデータ数を指定する

v= : 型=str , 任意(default=)

分割するデータごとにデータ量の重みを指定する

共通パラメータ

i= , nfn= , nfno= , x= , tmpPath= , precision=

利用例

importと入力データ(CSV)の準備

 1import nysol.mcmd as nm
 2
 3with open('dat1.csv','w') as f:
 4  f.write(
 5'''customer,quantity,amount
 6A,20,5200
 7B,18,4000
 8C,15,3500
 9D,10,2000
10E,3,800
11''')
12
13with open('dat2.csv','w') as f:
14  f.write(
15'''customer,date,amount
16A,20081201,10
17A,20081207,20
18A,20081213,30
19B,20081002,40
20B,20081209,50
21C,20081003,60
22C,20081219,20
23''')

基本例

指定した項目の値(顧客)が同じであれば同一のファイルに出力にされるように2つのファイルに分割する

1nm.mshuffle(f="customer", d="./dat/d", n="2", i="dat2.csv").run()
2###  の内容

f=を指定しない例

f=を指定せず2つのファイルに分割する。 行番号のhash値を用いるので、2つのファイルの行数はほぼ等しくなる。

1nm.mshuffle(d="./dat/d", n="2", i="dat2.csv").run()
2###  の内容

v=,f=の指定

v=2,1を指定することで、ファイル0(d_0)には2つのhash値を割り当て、 ファイル1(d_1)には1つのhash値を割り当てて分割する。

1nm.mshuffle(f="customer", d="./dat/d", v="2,1", i="dat2.csv").run()
2###  の内容

v=の指定

例3をf=の指定なしで実行する。 行番号のhash値を用いるので、この場合は出力行数の比と重みの比がほぼ等しくなる。

1nm.mshuffle(d="./dat/d", v="2,1", i="dat2.csv").run()
2###  の内容

関連メソッド