2016-12-15 7 views
0

私はCで生成されたバイナリファイルを持っています。 ファイルの固定レコード長は26000倍で、セパレータなしの1067レコードです。私は火花でそれを読んで、二重の価値を得る必要があります。 また、double型の値を取得し、spark-shellのjavaからFiles.readAllBytesを使用するPythonコードを持っています。これらの値も得られます。したがって、Python出力に基づいて、最初のレコードの最初の1000倍値は-3509.580466022612です。 (firstRecord.length = 208000)レコードの数は(arrayOfRecords.length = 1068)正しいよう、レコードごとのバイト数が、私にはよさそうだsparkでdouble型のバイナリファイルを読み出すと間違った出力が発生する

import java.nio.ByteBuffer 
import java.nio.ByteOrder 
val doubleByteSize = 8 
val recordLength = 1000 * 26 * doubleByteSize 
val bytesRdd = sc.binaryRecords("file:///myBinaryFile.val", recordLength) 
val arrayOfRecords = bytesRdd.collect 
val firstRecord = arrayOfRecords(0) 
// group 8 bytes together to transform them to doubles 
val listOfDoubles = firstRecord.grouped(doubleByteSize).toList 
// I get 1000 times the same double but isn't -3509.580466022612 it's 1.1848107264484659E181 
val result = listOfDoubles.map(arrayOfBytes => ByteBuffer.wrap(arrayOfBytes).getDouble) 
// try with little endian and it is wrong again -6.045003065652023E-27 
val result2 = listOfDoubles.map(arrayOfBytes => ByteBuffer.wrap(arrayOfBytes).order(ByteOrder.LITTLE_ENDIAN).getDouble) 

と第一千倍: は火花シェルから撮影します(1.1848107264484659E181)は期待値ではありません(-3509.580466022612)。私はリトルエンディアンに変更しようとしましたが、数字はまだ間違っています(-6.045003065652023E-27)。 Pythonコード:

val byteArray = Files.readAllBytes(Paths.get("/mybinaryFile.val")) 
// gets the correct value -3509.580466022612 
ByteBuffer.wrap(byteArray).order(ByteOrder.LITTLE_ENDIAN).getDouble 

誰もがここで何が起こっている上の任意のアイデアを持っています(スパーク・シェルから)バイナリを読むこと

def str_all(data): 
ret_str = "" 
for d in data: 
    ret_str+= " " + str(d) 
return ret_str 

def main(): 

num_sim = 1000 
num_ts = 26 

record_index = 0 

deal_data = array('d') 
with open("/myBinaryFile.val","rb") as data_file: 
    data_file.seek(SIZEOFDOUBLE*record_index*num_sim*num_ts) 
    deal_data.fromfile(data_file,num_sim*num_ts) 
ts_index = 0 
deal_range = slice(ts_index*num_sim,(ts_index+1)*num_sim) 
# it prints 1000 times -3509.580466022612 
print(str_all(deal_data[deal_range])) 

単純なJavaコードは、期待値を取得しますか?

ありがとうございます。 Scalaのバージョン2.10.5(ジャワのHotSpot(TM)64ビットサーバーVMはJava 1.7.0_67)を使用し

スパークバージョン1.6.0は、 Pythonバージョン2.6

+0

Pythonコードを表示してください。 –

+0

また、Java-IOバージョン(ファイルを読むためにSparkを使用しないでください)から始めて、残りの処理が期待どおりであることを確認してください。 –

+0

私の2セント:バイナリデータを読むPythonスニペットがあれば、PySparkに切り替え、Pandasデータフレームにデータをロードし、Sparkデータフレーム、つまり 'mySpkDF = sqlContext.createDataFrame(myPndDF)'に変換し、寄木張り; Scalaに戻って寄木細工のデータを読み返してください。 –

答えて

0

問題がバイナリデータと関連していませんでした私がやっていた自分自身、:

val arrayOfRecords = bytesRdd.collect 
val firstRecord = arrayOfRecords(0) 

私は、Arrayが注文なっていませんでした、問題を解決し交換:収集を保存しないように

val firstRecord = bytesRdd.first 

が見えます注文。あなたの時間と助けのためにArchetypal Paulに感謝します。

関連する問題