在 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...|
+--------------------+--------------------+------+--------------------+
谢谢
我需要从二进制文件中提取数据。
我用了 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...|
+--------------------+--------------------+------+--------------------+
谢谢