【问题标题】:Reading binary file in Spark Scala在 Spark Scala 中读取二进制文件
【发布时间】:2020-09-04 22:28:09
【问题描述】:

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

我使用binaryRecords 并得到RDD[Array[Byte]]

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

我该怎么做?

【问题讨论】:

  • 二进制文件中有分隔符吗?
  • 不,没有分隔符。 C程序构建的常规二进制文件,结构为int、short、long

标签: scala apache-spark binaryfiles


【解决方案1】:

假设你没有分隔符,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,如果需要,您可以使用其他库。

【讨论】:

    【解决方案2】:

    从 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()
    

    这将输出架构和数据帧,如下所示

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

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2021-12-08
      相关资源
      最近更新 更多