在 Spark Scala 中读取二进制文件

Reading binary file in Spark Scala

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

我用了 binaryRecords 得到了 RDD[Array[Byte]]

从这里我想将每条记录解析成 case class (Field1: Int, Filed2 : Short, Field3: Long)

我该怎么做?

假设你没有定界符,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 库将字节转换为 Int/Short/Long,如果需要,您可以使用其他库。

从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...|
+--------------------+--------------------+------+--------------------+

谢谢