开发者社区> 问答> 正文

按用户ID减少输入文件

按用户ID减少输入文件

我正在使用包含userId,seqId,eventType和country的结构化输入文件。我需要通过userId在seqId排序后获取每个字段的最后一个非空值来减少它。对于给定的输入:

userId seqId eventType country
A1600001 2 Update JP
A1600001 3 Update
B2301001 2 Update CH
A1600001 1 Create CH
C1200011 2 Update
C1200011 1 Create IN
减少的结果应该是:

A1600001 3 Update JP
C1200011 2 Update IN
B2301001 2 Update CH
我从以下开始:

scala> val file = sc.textFile("/tmp/sample-events.tsv")
scala> val lines = file.map( x => (x.split("t")(0), x) )
scala> lines.foreach(x => println(x))
(A1600001,A1600001 2 Update JP)
(A1600001,A1600001 3 Update US)
(B2301001,B2301001 2 Update CH)
(A1600001,A1600001 1 Create CH)
(C1200011,C1200011 2 Update RU)
(C1200011,C1200011 1 Create IN)
现在我想减少ByKey行,但我不知道如何构建缩减函数。

展开
收起
社区小助手 2018-12-19 15:39:33 1490 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    一种可能的方式(假设seqId从不为空):

    准备pair_rdd1通过过滤掉所有空eventType值与映射器,然后再应用reduceByKey重点= userId找到最新的非空eventType每次userId。假设reducer函数需要两[seqId, eventType]对并返回[seqId, eventType]pair,reduce函数应如下所示:(v1 v2) => ( if(v1[seqId] > v2[seqId]) then v1 else v2 )
    准备pair_rdd2通过过滤掉所有空country值与映射器,然后再应用reduceByKey重点= userId找到最新的非空country每次userId。假设reducer函数需要两[seqId, country]对并返回[seqId, country]pair,reduce函数应如下所示:(v1 v2) => ( if(v1[seqId] > v2[seqId]) then v1 else v2 )
    既然我们也需要最新的seqIdper userId,我们pair_rdd3通过应用reduceByKeykey = userId和reducer函数来准备:(seqId1 seqId2) => max(seqId1, seqId2)
    现在我们执行pair_rdd3.leftOuterJoin(pair_rdd1)获取[userId, seqId, eventType],然后在左连接的结果我们执行.leftOuterJoin(pair_rdd2)到最终获取[userId, seqId, eventType, country](两个连接都在键= userId)
    请注意,我们使用的left join不是inner join此处,因为可能存在所有eventTypes或所有国家/地区为空的用户ID

    2019-07-17 23:22:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载