为了账号安全,请及时绑定邮箱和手机立即绑定

根据字符串中的特定值进行排序。

根据字符串中的特定值进行排序。

ABOUTYOU 2021-04-06 12:31:11
我有一个内容如下的文件:    666500872101_002.log    738500861101_003.log    738500861101_002.log    666500872101_001.log    741500881101_001.log    738500861101_001.log    741500881101_002.log    666500872101_003.log    741500881101_003.log    666500872101_004.log我需要首先基于字段5至8中的值对行进行排序,即7415 0088 1101_003.log,然后基于日志的部件号即741500881101_ 003 .log来获得如下所示的内容:738500861101_001.log738500861101_002.log738500861101_003.log666500872101_001.log666500872101_002.log666500872101_003.log666500872101_004.log        741500881101_001.log741500881101_002.log741500881101_003.log使用无法获得任何良好的结果sort。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以sort在以下选项中使用命令wit:

sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort.log

选项:

  • -n 用于数字排序

  • -k1.5,1.8-k1.14,1.16定义您的排序键

例子:

$ sort -n -k1.5,1.8 -n -k1.14,1.16 fileToSort 

738500861101_001.log

738500861101_002.log

738500861101_003.log

666500872101_001.log

666500872101_002.log

666500872101_003.log

666500872101_004.log

741500881101_001.log

741500881101_002.log

741500881101_003.log


查看完整回答
反对 回复 2021-04-16
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

在学习SPARK的过程中,我解决了这个问题。我不是UNIX shell程序员。因此想到了用火花解决问题


val logList = Array("666500872101_002.log","738500861101_003.log","738500861101_002.log","666500872101_001.log","741500881101_001.log","738500861101_001.log","741500881101_002.log","666500872101_003.log","741500881101_003.log","666500872101_004.log")


val logListRDD = sc.parallelize(logList)

logListRDD.map(x=>((x.substring(4,8), x.slice(x.indexOfSlice("_") +1, x.indexOfSlice("."))),x)).sortByKey().values.collect.take(20)

输出:


Array [String] = Array(738500861101_001.log,738500861101_002.log,738500861101_003.log,666500872101_001.log,666500872101_002.log,666500872101_003.log,666500872101_004.log,741500881101_001.log,741500881101_1500.002


解释我做了什么


sc.parallelize(logList) -是创建RDD的步骤,该RDD是spark的核心组件。


map(x =>(((x.substring(4,8),x.slice(x.indexOfSlice(“ _”)+1,x.indexOfSlice(“。”))),x)) -这将提取内容从Array生成键值对。在我们的例子中,value是***。log值,键是我们要排序的子字符串数组(0086,001)。KeyValue对将看起来像[(0086,001),738500861101_001.log]


sortByKey() -根据上面生成的Key对数据进行排序


values-获取与键对应的值


collect.take(20) ->在屏幕上显示o / p


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信