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=)
分割するデータごとにデータ量の重みを指定する
利用例¶
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### の内容
関連メソッド¶
msep レコードの分割 : 項目値によるレコードの分割