将Spark Scala Dataframe列转换为字节数组

时间:2018-02-06 03:01:53

标签: scala apache-spark jackson

我试图将Spark Scala DataFrame列编写为字节数组。 我有一个由两列组成的DataFrame。第一列是字符串,第二列是从字符串到长字的映射。

例如,

user_id | map
"ac2"   | Map("c2" -> 1, "b3" -> 5)

我想将map列写为字节数组。到目前为止,我已经尝试使用杰克逊以下UDF

val writeJackson = udf { x: Map[String, Long] =>
    jacksonWriter.writeValueAsBytes(x)
}

val df2 = df.withColumn("jacksonMap", writeJackson($"map"))

但由于

而失败
  

java.io.NotSerializableException:com.fasterxml.jackson.module.paranamer.shaded.CachingParanamer

有没有办法让这个与Jackson合作,如果没有,是否有一个不同的库可以让我把这个Spark列写成一个字节数组?

1 个答案:

答案 0 :(得分:0)

我可以转换为ByteArray并使用以下代码获取输出。使用spark 1.6.2。

object DF {

  def main(args: Array[String]): Unit = {

    val mapper: ObjectMapper = new ObjectMapper
    mapper.registerModule(DefaultScalaModule)

    val df = Seq(
      ("ac2", Map("c2" -> 1, "b3" -> 5))
    ).toDF("id", "map")

    df.show(false)
    //output
    // +---+---------------------+
    // |id |map                  |
    // +---+---------------------+
    // |ac2|Map(c2 -> 1, b3 -> 5)|
    // +---+---------------------+
    val getByteArray = udf((map: Map[String, Int]) => mapper.writeValueAsBytes(map))

    df.withColumn("bytearray", getByteArray($"map")).show(false)

    //output
    // +---+---------------------+----------------------------------------------+
    // |id |map                  |bytearray                                     |
    // +---+---------------------+----------------------------------------------+
    // |ac2|Map(c2 -> 1, b3 -> 5)|[7B 22 63 32 22 3A 31 2C 22 62 33 22 3A 35 7D]|
    // +---+---------------------+----------------------------------------------+
  }
}