有没有办法在Spark中将每个分组数据集作为一个整体进行修改?

v7pvogib  于 2023-01-26  发布在  Apache
关注(0)|答案(1)|浏览(152)

我有一个数据集,我想用一种更灵活的方式来对分组数据进行分组和编辑。例如,我想从此数据集中的每组名称中删除第二个Random_Text,并连接其余文本:
以随机数据集为例

+-------+-----------+
|  Names|Random_Text|
+-------+-----------+
|Michael|      Hello|
|    Jim|       Good|
|    Bob|        How|
|Michael|       Good|
|Michael|    Morning|
|    Bob|        Are|
|    Bob|        You|
|    Bob|      Doing|
|    Jim|        Bye|
+-------+-----------+

我希望数据集看起来像这样:

+-------+-------------+
|  Names|  Random_Text|
+-------+-------------+
|Michael|Hello Morning|
|    Jim|         Good|
|    Bob|How You Doing|
+-------+-------------+

我想我需要定义某种自定义的用户定义聚合函数,但我想不出它在Java中是什么样子的。我浏览了文档,但我找不到任何在Java中有意义的具体内容:https://spark.apache.org/docs/3.0.2/api/java/org/apache/spark/sql/functions.htmlhttps://docs.databricks.com/udf/aggregate-scala.html

Dataset<Row> random_text = dtf.groupBy(col("Names")).apply(???)
Dataset<Row> random_text = dtf.groupBy(col("Names")).agg(???)
whlutmcx

whlutmcx1#

您可以使用窗口函数row_number从每组中识别第二个Random_Text,然后对其进行过滤。

所需导入:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.expressions.*;
import static org.apache.spark.sql.functions.*;

代码:

Dataset<Row> df = // input;

df.withColumn("rn",
                row_number().over(Window.partitionBy("Names").orderBy("Names")))
                .where("rn <> 2")
                .groupBy("Names")
                .agg(concat_ws(" ", collect_list("Random_Text")).as("Random_Text"))
                .show();

+-------+-------------+
|  Names|  Random_Text|
+-------+-------------+
|    Jim|         Good|
|Michael|Hello Morning|
|    Bob|How You Doing|
+-------+-------------+

相关问题