Преобразовать столбец Array of String в несколько столбцов в искровом scala - PullRequest
0 голосов
/ 16 мая 2018

У меня есть фрейм данных со следующей схемой:

id         : int,
emp_details: Array(String)

Некоторые примеры данных:

1, Array(empname=xxx,city=yyy,zip=12345)
2, Array(empname=bbb,city=bbb,zip=22345)

Эти данные есть в фрейме данных, и мне нужно прочитать emp_details измассив и назначить его для новых столбцов, как показано ниже, или если я могу split этот массив для нескольких столбцов с именами столбцов, как empname, city и zip:

.withColumn("empname", xxx)
.withColumn("city", yyy)
.withColumn("zip", 12345)

Не могли бы вы, пожалуйста, руководствокак мы можем достичь этого, используя Spark (1.6) Scala.

Очень ценю вашу помощь ...

Большое спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать withColumn и split, чтобы получить необходимые данные

df1.withColumn("empname", split($"emp_details" (0), "=")(1))
  .withColumn("city", split($"emp_details" (1), "=")(1))
  .withColumn("zip", split($"emp_details" (2), "=")(1)) 

Выход:

+---+----------------------------------+-------+----+-----+
|id |emp_details                       |empname|city|zip  |
+---+----------------------------------+-------+----+-----+
|1  |[empname=xxx, city=yyy, zip=12345]|xxx    |yyy |12345|
|2  |[empname=bbb, city=bbb, zip=22345]|bbb    |bbb |22345|
+---+----------------------------------+-------+----+-----+

UPDATE:
Если у вас нет фиксированной последовательности данных в array, вы можете использовать UDF для преобразования в map и использовать ее как

val getColumnsUDF = udf((details: Seq[String]) => {
  val detailsMap = details.map(_.split("=")).map(x => (x(0), x(1))).toMap
  (detailsMap("empname"), detailsMap("city"),detailsMap("zip"))
})

Теперь используйте udf

df1.withColumn("emp",getColumnsUDF($"emp_details"))
 .select($"id", $"emp._1".as("empname"), $"emp._2".as("city"), $"emp._3".as("zip"))
 .show(false)

Выход:

+---+-------+----+---+
|id |empname|city|zip|
+---+-------+----+---+
|1  |xxx    |xxx |xxx|
|2  |bbb    |bbb |bbb|
+---+-------+----+---+

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...