私は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
Pythonコードを表示してください。 –
また、Java-IOバージョン(ファイルを読むためにSparkを使用しないでください)から始めて、残りの処理が期待どおりであることを確認してください。 –
私の2セント:バイナリデータを読むPythonスニペットがあれば、PySparkに切り替え、Pandasデータフレームにデータをロードし、Sparkデータフレーム、つまり 'mySpkDF = sqlContext.createDataFrame(myPndDF)'に変換し、寄木張り; Scalaに戻って寄木細工のデータを読み返してください。 –