Я пытаюсь преобразовать массив строк в байтовый массив в Spark и заново преобразовать массив байтов в массив строк.
Однако я не получаю массив String, как я намереваюсь. Вот код -
// UDFs for converting Array[String] to byte array and get back Array[String] from byte array
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.ObjectMapper
val mapper: ObjectMapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
val convertToByteArray = udf((map: Seq[String]) => mapper.writeValueAsBytes(map))
val convertToString = udf((a: Array[Byte])=> new String(a))
val arrayDF = Seq(
("x100", Array("p1","p2","p3","p4"))
).toDF("id", "myarray")
arrayDF.printSchema()
root
|-- id: string (nullable = true)
|-- myarray: array (nullable = true)
| |-- element: string (containsNull = true)
arrayDF.show(false)
+----+----------------+
|id |myarray |
+----+----------------+
|x100|[p1, p2, p3, p4]|
+----+----------------+
val converted = arrayDF.withColumn("bytearray", convertToByteArray($"myarray")).select($"id",$"bytearray")
converted.printSchema()
root
|-- id: string (nullable = true)
|-- bytearray: binary (nullable = true)
converted.show(false)
+----+----------------------------------------------------------------+
|id |bytearray |
+----+----------------------------------------------------------------+
|x100|[5B 22 70 31 22 2C 22 70 32 22 2C 22 70 33 22 2C 22 70 34 22 5D]|
+----+----------------------------------------------------------------+
val getBack = converted.withColumn("getstring", convertToString($"bytearray"))
getBack.printSchema()
root
|-- id: string (nullable = true)
|-- bytearray: binary (nullable = true)
|-- getstring: string (nullable = true)
getBack.show(false)
+----+----------------------------------------------------------------+---------------------+
|id |bytearray |getstring |
+----+----------------------------------------------------------------+---------------------+
|x100|[5B 22 70 31 22 2C 22 70 32 22 2C 22 70 33 22 2C 22 70 34 22 5D]|["p1","p2","p3","p4"]|
+----+----------------------------------------------------------------+---------------------+
Тем не менее, я хочу, чтобы мои окончательные результаты как -
+----+----------------------------------------------------------------+---------------------+
|id |bytearray |getstring |
+----+----------------------------------------------------------------+---------------------+
|x100|[5B 22 70 31 22 2C 22 70 32 22 2C 22 70 33 22 2C 22 70 34 22 5D]|[p1,p2,p3,p4]|
+----+----------------------------------------------------------------+---------------------+
Вот pom.xml
, который я использую для создания байтового массива
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>