Scala 如何在不影响数据结构的情况下对Spark数据集执行某些操作?
我正在使用spark数据集API删除几乎重复的数据。我要做的是对重复的行进行分组,以便每个组只留下一行,但有一列指定已折叠到此行中的行数 考虑下面的例子。我有以下数据,其中最后一个字段指定折叠到该行中的行:Scala 如何在不影响数据结构的情况下对Spark数据集执行某些操作?,scala,apache-spark,duplicates,spark-dataframe,Scala,Apache Spark,Duplicates,Spark Dataframe,我正在使用spark数据集API删除几乎重复的数据。我要做的是对重复的行进行分组,以便每个组只留下一行,但有一列指定已折叠到此行中的行数 考虑下面的例子。我有以下数据,其中最后一个字段指定折叠到该行中的行: A、 B、C、5 A、 D,G,1 此时,我希望按第一个字段对数据进行分组,保留行中大多数行折叠到其中的其余字段,并将折叠到第二个字段中的行数添加到第一个字段中。因此,结果将是: A、 B、C、6 我已经实现了它,问题是结果数据的格式 这是我的密码: val sameTitleArt
- A、 B、C、5
- A、 D,G,1
- A、 B、C、6
val sameTitleArticlesCollapsed = articlesCollapsed.groupByKey(_.TITLE).reduceGroups((a,b) => if(a.TIMES_COLLAPSED > b.TIMES_COLLAPSED) a.copy(TIMES_COLLAPSED = a.TIMES_COLLAPSED + b.TIMES_COLLAPSED) else b.copy(TIMES_COLLAPSED = a.TIMES_COLLAPSED + b.TIMES_COLLAPSED)).toDF("key", "data")
如果在sameTitleArticlesCollapsed
上执行printSchema
,则输出为:
root
|-- key: string (nullable = true)
|-- data: struct (nullable = true)
| |-- CODE: string (nullable = true)
| |-- TITLE: string (nullable = true)
| |-- NAUTHORS: string (nullable = true)
| |-- AUTHORS: string (nullable = true)
| |-- TIMES_COLLAPSED: decimal(38,0) (nullable = true)
我不关心键
列,我想提取数据
列中的数据,使其保持与应用groupByKey-reducegroup
之前相同的格式
root
|-- CODE: string (nullable = true)
|-- TITLE: string (nullable = true)
|-- NAUTHORS: string (nullable = true)
|-- AUTHORS: string (nullable = true)
|-- TIMES_COLLAPSED: long (nullable = false)
我怎么能这么做?有没有更好的方法来完成这个过程
谢谢大家! 您可以在末尾添加一个映射,如下图所示,以保留原始模式
val sameTitleArticlesCollapsed = articlesCollapsed.groupByKey(_.title).reduceGroups((a,b) => if(a.times_collapsed > b.times_collapsed) a.copy(times_collapsed = a.times_collapsed + b.times_collapsed) else b.copy(times_collapsed = a.times_collapsed + b.times_collapsed))
val result = sameTitleArticlesCollapsed.map({case (_,value) => value}).toDF
result.printSchema
root
|-- code: string (nullable = true)
|-- title: string (nullable = true)
|-- nauthors: string (nullable = true)
|-- authors: string (nullable = true)
|-- times_collapsed: long (nullable = true)