我正在使用SPARK DATASET API删除重复项附近。我要做的是将重复的行分组,以便从每个组中留下一行,但用一列指定已折叠到此行的行数。
考虑以下示例。我有以下数据,其中最后一个字段指定的行折叠到该行中:
- 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)
我不在乎key
列,我想要的是在data
列内提取数据以与应用groupByKey - reduceGroups
之前的格式保持相同的格式。
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)