Я решил эту проблему как часть изучения SPARK.Я не программист оболочки UNIX.Поэтому подумайте о решении проблемы с помощью spark
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_002.log, 741500881101_003.log)
объяснение того, что я сделал
* параллельный(logList) - это шаг для создания RDD, который является основным компонентом spark.
map (x => ((x.substring (4,8), x.slice)(x.indexOfSlice ("_") +1, x.indexOfSlice ("."))), x)) - извлекает содержимое из массива и генерирует пару ключ-значение.В нашем случае значением является значение ***. Log, а ключом является массив подстрок, по которому мы хотели отсортировать (0086, 001).Пара KeyValue будет выглядеть как [(0086, 001), 738500861101_001.log]
sortByKey () - сортирует данные на основе сгенерированного выше ключа
значения - получает значение, соответствующее клавише
collect.take (20) -> Отображение o / p на экране