在Spark Scala中读取二进制文件

时间:2015-11-11 15:38:39

标签: scala apache-spark binaryfiles

我需要从二进制文件中提取数据。

我使用了binaryRecords并获得RDD[Array[Byte]]

从这里开始我要解析每条记录 case class (Field1: Int, Filed2 : Short, Field3: Long)

我该怎么做?

2 个答案:

答案 0 :(得分:4)

假设您没有分隔符,Scala中的Int是4个字节,Short是2个字节,long是8个字节。假设二进制数据的结构(对于每一行)为Int Short Long。您应该能够获取字节并将它们转换为您想要的类。

import java.nio.ByteBuffer

val result = YourRDD.map(x=>(ByteBuffer.wrap(x.take(4)).getInt,
             ByteBuffer.wrap(x.drop(4).take(2)).getShort,
             ByteBuffer.wrap(x.drop(6)).getLong))

这使用Java库将Bytes转换为Int / Short / Long,如果需要,可以使用其他库。

答案 1 :(得分:0)

从Spark 3.0开始,Spark具有一个“ binaryFile”数据源来读取二进制文件

我在How to read Binary file into DataFrame上找到了更多说明。

val df = spark.read.format("binaryFile").load("/tmp/binary/spark.png")
  df.printSchema()
  df.show()

这将如下输出模式和DataFrame

root
 |-- path: string (nullable = true)
 |-- modificationTime: timestamp (nullable = true)
 |-- length: long (nullable = true)
 |-- content: binary (nullable = true)

+--------------------+--------------------+------+--------------------+
|                path|    modificationTime|length|             content|
+--------------------+--------------------+------+--------------------+
|file:/C:/tmp/bina...|2020-07-25 10:11:...| 74675|[89 50 4E 47 0D 0...|
+--------------------+--------------------+------+--------------------+

谢谢