检索列中具有不同值的 Spark 数据集
Retrieve Spark Dataset with Distinct values in a Column
我已经从 csv 文件创建了一个 Spark 数据集。
架构是:
|-- 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 文件,其中的行具有不同的电子邮件 ID。
如何查询以检索具有不同电子邮件记录的数据集?
示例输入:
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
提前致谢
这是使用 window 函数的一种方法。
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)
代码将按电子邮件进行分区,然后 return 每个分区的第一行。
输出:
+---------+--------+------------------+-----+
|FirstName|LastName|Email |Phone|
+---------+--------+------------------+-----+
|John |Smith |john.smith@abc.com|4444 |
|John |David |john.david@abc.com|2222 |
+---------+--------+------------------+-----+
我已经从 csv 文件创建了一个 Spark 数据集。
架构是:
|-- 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 文件,其中的行具有不同的电子邮件 ID。
如何查询以检索具有不同电子邮件记录的数据集?
示例输入:
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
提前致谢
这是使用 window 函数的一种方法。
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)
代码将按电子邮件进行分区,然后 return 每个分区的第一行。
输出:
+---------+--------+------------------+-----+
|FirstName|LastName|Email |Phone|
+---------+--------+------------------+-----+
|John |Smith |john.smith@abc.com|4444 |
|John |David |john.david@abc.com|2222 |
+---------+--------+------------------+-----+