首页 > 解决方案 > 使用 Apache Spark 2.4 从存储为 SQL Server 2016 中的二进制(序列化哈希表)的 Spark Dataframe 列获取哈希表/映射

问题描述

在一个遗留应用程序中,在 DB - SQL Server 2016 中,我们有一个表 - 措施

它有 15+ 列,其中一列是二进制的

在此处输入图像描述

当我加载到 Spark 并打印 Schema 时,它的二进制文件

scala> jdbcDF.printSchema()
root
 |-- measurementValues: binary (nullable = true)
 |-- measure: string (nullable = true)

看起来,他们使用了Hashtable,将其序列化并作为二进制存储到 Table Column


我正在尝试将其反序列化回哈希表(或)映射(或)某些集合,以便在执行 ETL 操作时能够转换为 JSON 格式

有人可以在这里帮忙吗?我试图将二进制文件转换为字符串,仍然没有用:(

val convertToString = udf((a: Array[Byte])=> new String(a))

在此处输入图像描述

标签: sql-serverscalaapache-sparkhashtable

解决方案


  def deserializeBinary = udf((x: Array[Byte]) => {
    val stream: InputStream  = new ByteArrayInputStream(x);
    val obs = new ObjectInputStream(stream)
    val stock = obs.readObject.asInstanceOf[util.Hashtable[String, String]]
    stock
  })

推荐阅读