我需要从二进制文件中提取数据。
我使用了binaryRecords
并获得RDD[Array[Byte]]
。
从这里开始我要解析每条记录
case class (Field1: Int, Filed2 : Short, Field3: Long)
我该怎么做?
答案 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...|
+--------------------+--------------------+------+--------------------+
谢谢