scala spark, как объединить набор столбцов в один столбец данных? - PullRequest
0 голосов
/ 20 февраля 2019

Я ищу способ сделать это без UDF, мне интересно, если это возможно.Допустим, у меня есть DF следующим образом:

Buyer_name  Buyer_state  CoBuyer_name  CoBuyers_state  Price  Date
Bob         CA           Joe           CA              20     010119
Stacy       IL           Jamie         IL              50     020419
... about 3 millions more rows...

И я хочу превратить его в:

Buyer_name Buyer_state Price Date
Bob        CA          20    010119
Joe        CA          20    010119
Stacy      IL          50    020419
Jamie      IL          50    020419
...

Редактировать: я также мог,

Создать два кадра данныхудаление столбцов «Покупатель» из одного и столбцов «Cobuyer» из другого.

Переименование фрейма данных со столбцами «Cobuyer» в столбцы «Покупатель».

Объединение обоих фреймов данных.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Для меня это звучит как операция отмены, которую можно выполнить с помощью функции union в Scala:

val df = Seq(
  ("Bob", "CA", "Joe", "CA", 20, "010119"),
  ("Stacy", "IL", "Jamie", "IL", 50, "020419")
).toDF("Buyer_name", "Buyer_state", "CoBuyer_name", "CoBuyer_state", "Price", "Date")

val df_new = df.select("Buyer_name", "Buyer_state", "Price", "Date").union(df.select("CoBuyer_name", "CoBuyer_state", "Price", "Date"))

df_new.show

Спасибо Лео за предоставление определения фрейма данных, которое я использовал повторно.

0 голосов
/ 20 февраля 2019

Вы можете сгруппировать struct(Buyer_name, Buyer_state) и struct(CoBuyer_name, CoBuyer_state) в Array, который затем расширяется с помощью explode, как показано ниже:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  ("Bob", "CA", "Joe", "CA", 20, "010119"),
  ("Stacy", "IL", "Jamie", "IL", 50, "020419")
).toDF("Buyer_name", "Buyer_state", "CoBuyer_name", "CoBuyer_state", "Price", "Date")

df.
  withColumn("Buyers", array(
    struct($"Buyer_name".as("_1"), $"Buyer_state".as("_2")),
    struct($"CoBuyer_name".as("_1"), $"CoBuyer_state".as("_2"))
  )).
  withColumn("Buyer", explode($"Buyers")).
  select(
    $"Buyer._1".as("Buyer_name"), $"Buyer._2".as("Buyer_state"), $"Price", $"Date"
  ).show
// +----------+-----------+-----+------+
// |Buyer_name|Buyer_state|Price|  Date|
// +----------+-----------+-----+------+
// |       Bob|         CA|   20|010119|
// |       Joe|         CA|   20|010119|
// |     Stacy|         IL|   50|020419|
// |     Jamie|         IL|   50|020419|
// +----------+-----------+-----+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...