Получить набор данных Spark с разными значениями в столбце - PullRequest
0 голосов
/ 13 мая 2019

Я создал набор данных Spark из CSV-файла.

Схема:

 |-- FirstName: string (nullable = true)<br>
 |-- LastName: string (nullable = true)<br>
 |-- Email: string (nullable = true)<br>
 |-- Phone: string (nullable = true)

Я выполняю дедупликацию в поле электронной почты:

Dataset<Row> customer=  spark.read().option("header","true").option("charset","UTF8")
                    .option("delimiter",",").csv(path);

Dataset<Row> distinct =  customer.select(col).distinct();

Я хотел бы создать выходной CSV-файл со строками с разными идентификаторами электронной почты.

Как выполнить запрос, чтобы получить набор данных с записями с отдельным адресом электронной почты?

Пример ввода:

John David john.david@abc.com 2222
John Smith john.smith@abc.com 4444
John D john.david@abc.com 2222

Пример вывода:

John David john.david@abc.com 2222
John Smith john.smith@abc.com 4444

Заранее спасибо

1 Ответ

0 голосов
/ 13 мая 2019

Вот один из способов использования оконной функции.

import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window

val df = Seq(
("John", "David", "john.david@abc.com", 2222),
("John", "Smith", "john.smith@abc.com", 4444),
("John", "D", "john.david@abc.com", 2222)       
).toDF("FirstName", "LastName", "Email", "Phone")

val w = Window.partitionBy($"Email").orderBy($"Phone")

df.withColumn("row", row_number.over(w))
              .where($"row" === 1)
              .drop("row")
              .show(false)

Код разделится по электронной почте, а затем вернет первую строку для каждого раздела.

Выход:

+---------+--------+------------------+-----+
|FirstName|LastName|Email             |Phone|
+---------+--------+------------------+-----+
|John     |Smith   |john.smith@abc.com|4444 |
|John     |David   |john.david@abc.com|2222 |
+---------+--------+------------------+-----+
...