Преобразование массива строк в Spark в байтовый массив и получение его обратно с использованием UDF - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь преобразовать массив строк в байтовый массив в 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>

1 Ответ

0 голосов
/ 28 июня 2018

вы берете список строк и обрабатываете его как один объект, а при обратном преобразовании вы обрабатываете его, как если бы вы были просто строкой - если вы хотите вернуть обратно одну строку, вам также необходимо преобразовать список в строку:

val convertToByteArray = udf((map: Seq[String]) => mapper.writeValueAsBytes(map.mkString("[",",","]")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...