spark scala编程,问了十几个群没人会

[复制链接]
查看11 | 回复4 | 2021-1-27 05:48:44 | 显示全部楼层 |阅读模式
数据样本格式如下:

abc`1`31

abc`3`24

abc`2`25

cbd`2`30



即:X`X`X



希望 第一个x相同的 归为一类

然后按照第二个x从小到大排序

样本变为:

abc`1`31

abc`2`25

abc`3`24

cbd`2`30

然后检测 第三个x是否为递减



如果递减输出 abc
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:48:44 | 显示全部楼层
没人么快来人那
回复

使用道具 举报

千问 | 2021-1-27 05:48:44 | 显示全部楼层
如果三个x的长度是一样的,直接把样本字符串集合升序排列一下不就是按第一个x分类,第二个x从小到大吗?
回复

使用道具 举报

千问 | 2021-1-27 05:48:44 | 显示全部楼层
引用2楼u013170811的回复:如果三个x的长度是一样的,直接把样本字符串集合升序排列一下不就是按第一个x分类,第二个x从小到大吗?
可以分割字符串并且groupby,关键是下一步
回复

使用道具 举报

千问 | 2021-1-27 05:48:44 | 显示全部楼层
我这里想到一个方法。请参考是否合适。
思路如下:
1、排序(各列的宽度是固定的)
2、映射成类似(abc,(1,31))的数据结构
3、以第一列为key,进行groupByKey操作。形成类似(abc,CompactBuffer((1,31),(2,25),(3,24))))这样的数据结构。
4、再进行过滤操作。在自定义的函数中,判断第三列是否递减。过滤出递减的元素。
5、提取出满足条件的记录,对应的key,输出key
代码如下:

importorg.apache.spark.util.collection.CompactBuffer
defmyfunc(ele:((String,Iterable[(String,String)]))):Boolean={
variter=ele._2.iterator
varpre=iter.next
varisSorted=true
while(iter.hasNext&&isSorted){
valcur=iter.next;
if(cur._2.toInt>=pre._2.toInt){
isSorted=false
}
}
isSorted
}
varfileRDD=sc.textFile("file:///tmp/test.data")
fileRDD.sortBy(line=>line,true).
map(line=>line.toString().split("`")).
map(arr=>(arr(0),(arr(1),arr(2)))).
groupByKey.
filter(myfunc).
keys.
foreach(println)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行