我试图将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列写成一个字节数组?
答案 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]|
// +---+---------------------+----------------------------------------------+
}
}