Scala Spark Разнесите несколько пар столбцов в строки - PullRequest
3 голосов
/ 22 января 2020

Как я могу разбить несколько пар столбцов на несколько строк?

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

client, type, address,    type_2,   address_2
abc,    home, 123 Street, business, 456 Street

Я хочу получить финальный фрейм данных со следующим

client, type, address
abc, home, 123 Street
abc, business, 456 Street

Я попытался использовать этот код ниже, но он возвращает мне 4 записи вместо двух записей, которые я хочу

df .withColumn("type", explode(array("type", "type_2"))) .withColumn("address", explode(array("address", "address_2")))

Я могу сделать это с двумя отдельными кадрами данных и выполнить объединение, но я хотел посмотреть, есть ли другой способ сделать это в одном кадре данных

Спасибо

Ответы [ 2 ]

4 голосов
/ 22 января 2020

вы можете сделать это используя структуры:

df
  .withColumn("str",explode(
    array(
      struct($"type",$"address"),
      struct($"type_2".as("type"),$"address_2".as("address"))))
  )
  .select($"client",$"str.*")
  .show()

дает

+------+--------+----------+
|client|    type|   address|
+------+--------+----------+
|   abc|    home|123 Street|
|   abc|business|456 Street|
+------+--------+----------+
0 голосов
/ 23 января 2020

Вот метод, который я использую для сложных преобразований - сопоставьте записи на фрейме данных и используйте scala, чтобы применить преобразование любой сложности.

Здесь я использую жесткое кодирование для создания 2 строк, но с любой логикой c можно поставить здесь, чтобы взрывать строки по мере необходимости. Я использовал flatmap, чтобы разбить массив строк на строки.

    val df = spark.createDataFrame(Seq(("abc","home","123 Street","business","456 Street"))).toDF("client", "type", "address","type_2","address_2")

    df.map{ r =>
      Seq((r.getAs[String]("client"),r.getAs[String]("type"),r.getAs[String]("address")),
         (r.getAs[String]("client"),r.getAs[String]("type_2"),r.getAs[String]("address_2")))
    }.flatMap(identity(_)).toDF("client", "type", "address").show(false)

Результат

+------+--------+----------+
|client|type    |address   |
+------+--------+----------+
|abc   |home    |123 Street|
|abc   |business|456 Street|
+------+--------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...