开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第七阶段):统一识别_完成】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/682/detail/11842
统一识别_完成
对 agg 的结果再进行转换,转换成我们需要的形式
// 3. 聚合
// 结果集格式:mainId, tagsString
把对应的内容先生成出来,先把类创建出来
case class Tags(mainId: String, tags: String)
//这个类命名为 Tags,Tags 首先接收一个 id, 这个id 对应的是 String。
Id改名为 mainId,后面还要再跟上 tags,这个 tags 也是一个 String,这样的话 Tags 对象就生成了。
val grouped = components.groupByKey(component => component.component)
val agg
:Dataset[(Long,= VertexComponent)] = grouped.reduceGroups(reduceVertex_)
val result = agg.map(mapTags)
Result.show()
(先创建一个方法出来,这个方法命名为 mapTags)
def mapTags(VertexComponent
:(Long,VertexComponent)):Tags = {
val mainId = getMainId(vertexComponent._2.ids)
// tag1:1, tag2:1, tag3:1
val tags = VertexComponent._2.tags
.map(item => item._ 1 + ”:”+ item._2)
.mkString(“,”)
Tags(mainId, tags)
}
//Tags 对象创建好后,把 Dataset 转换为 DatasetTags, 先拿到agg.map; mapTags
里接收(Long,= VertexComponent),
转换成 Tags 对象,把mapTags
放到agg.map
当中,此时最终结果集就产生了,产生 result 后,直接来进行打印,但方法还没有写完,这个方法最重要产生一个 Tags 对象,
第一个对象为 mainId,第二个为 Tags,两个都要进行处理,首先第一个对象为 mainId ,获取 getMainId 后通过 VertexComponent 其中的第二项数据拿到一个 ids ,这样一个 map,把这个map 传进去就有了 mainId。
第二个对象为 tags, 这个 tags 由 VertexComponent 当中的 tags 来进行相应的合并,拿到 VertexComponent._2.tags,
把 tags 拼成“tag1:1, tag2:1, tag3:1”
的格式,这个 tags 是一个 Map,里面是String 对应的 Int,这个 String 对应的就是标签,这个 Int 对应的就是标签的权重;这样的话应先对其进行 map, map 拿到一个 item,item 是一个元组,第一项拼上第二项,为item._ 1 + ”:”+ item._2
,拼好后, 再进行转换为字符串,使用mkString(“,”)
按照逗号来分割进行相应的生成,此时 maptags 写完,
回到最上面点击运行,
此时运行结果出来了,计算的过程是比较慢的,数据没有问题,最终结果也求到了,没有地方是重复的。