Везде карта, плоская карта, что ты имеешь в виду?

Java Большие данные

Больше отличных статей.

«Микросервисы — это не все, а лишь подмножество определенного домена».

«Подбиблиотека и подтаблица»? Отбор и процесс должны быть осторожными, иначе все выйдет из-под контроля».

С таким количеством компонентов мониторинга всегда найдется подходящий для вас

«С Нетти, что мы разрабатываем? 》

«Вероятно, это наиболее подходящая спецификация Redis».

«Портрет программиста, десять лет взлетов и падений»

Самая полезная серия:

«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.

«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.

«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.


Недавно нанял интересного молодого коллегу и много занимался кодом. Я открыл git-запись и увидел, что ее много использовали.java8особенности синтаксиса, рефакторинг кода. Наиболее часто используетсяmap,flatMapкакой-то тип. Но другие друзья не хотят.Хотя некоторые люди считают, что код стал более понятным, больше людей считают, что код стал очень неясным.Это как: снимай штаны и пукай, и ты лишний.

Объем этих функций, в зависимости от уровня, я думаю, можно разделить на три категории. Это буквально везде.

не злоупотребляйте

Я также не знаю, когда эти функции стали популярными, но они должны быть очень тесно связаны с функциональным программированием. Похоже, это началось со Scala в 2004 году.

Ничего волшебного, все они — синтаксический сахар, чтобы сделать ваши программы более лаконичными. Вы можете сделать это с небольшим количеством кода, если хотите. Не используйте его преднамеренно, чтобы продемонстрировать свое мастерство. Крайности будут обратными. Если вы не используете их должным образом, эффект будет очень негативным. Например, java, который не является функциональным языком программирования, тогдаlambdaЭто просто помощь, и вы пишете ее на javaLispКод, он будет только невзрачный.

Но язык еще нужно интегрировать, потому что тренд такой. Вместо того, чтобы смотреть на дизайн, стоящий за ними, мы смотрим только на то, что они выражают горизонтально из семантического представления API.

Давайте сначала рассмотрим общие черты (примечание: логические общие черты, подходящие не для всех сценариев), а затем возьмем несколько типичных реализаций и посмотрим на выступления программистов на этой планете.

эти абстрактные понятия

Говорят, что объектом этих функций является нечто, называемое потоком. ТотЧто это за вещь? Пожалуйста, простите меня за объяснение с некоторыми непрофессиональными словами.

Будь то на уровне языка или распределенной структуры данных, на самом деле это простой массив. Иногда это действительно простой массив, иногда это распределенный массив, существующий на нескольких машинах. Далее в совокупности мы ссылаемся на数组流.

Мы просто делим их на две категории.

语言层面的:比如Java的Stream
分布式层面的:比如Spark的RDD

Все они имеют следующие важные моменты.

Функции могут использоваться в качестве параметров

Язык C, конечно, не проблема, вы можете передавать функции как указатели. Но не так давно в Java это приходилось реализовывать окольным путем (используя класс в концепции java для имитации функций, вы увидите много странных java-классов, таких как Func1 и Func0).

Функции как параметры — необходимое условие для того, чтобы сделать код кратким. Большинство наших обычных методов программирования заключаются в последовательном выполнении некоторых операций.

array = new Array()
array = func1(array)
if(func2(array)){
    array = func3(array)
}
array = func4(array)

И если функцию можно использовать в качестве параметра, я могу попытаться максимально разбить операцию на плитки. В конце концов, его еще нужно перевести в приведенный выше оператор для выполнения.

array = new Array()
array.stream()
.map(func1)
.filter(func2)
.flatMap(func3)
.sorted(func4)
...

Парадигма программирования полностью изменилась, и у функций появилась семантика.

sequential & parallel

если наш数组流Если он слишком велик для одной машины, есть два способа последовательной обработки и параллельной обработки.

Обычно это можно сделать поparallelФункция переходит в режим параллельной обработки. Для большинства локальных операций включение параллельного режима не обязательно быстрее. Набор ForkJoin, используемый в java, скорость потока, знаете ли...

Для распределенных потоков данных, которые по своей сути параллельны, этот параметр не имеет большого значения.

Вид функции

Функции, которые обычно воздействуют на потоки данных, делятся на две категории.

转换。Transformation
动作。Action

преобразование, которое обычно характеризуетсяlazy. ТолькоactionКогда он будет выполнен, он будет фактически участвовать в операции. Таким образом, вы можете думать об этих переходах как о наборе буферизованных операций. Типичные функции: карта, плоская карта и т. д. Они нанизаны, как вертел, и ждут, когда их разобьют.

действие. Настоящий триггерный код, описанный выше, также хлынет потоком, открывшим ворота. типичный какreduceфункция, вот и все.

Приведенное выше описание не обязательно совпадает, например, карта Python может выводить результат после выполнения. Это очень неловко.

map & reduce

Когда дело доходит до сопоставления и редукции, все неизменно думают о хаупе. Однако это не просто концепция больших данных.

Для понятия о них мы вводим только следующие две строки.

map

Примените переданную функцию к каждому элементу последовательности по очереди и используйте результат как новыйпоток массивавозвращение.

reduce

сокращение похоже на рекурсивную концепцию. в конечном итоге сведется к одному значению. Проверьте эту формулу :)

reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])

Подробнее см. в классической статье Google.

«MapReduce: упрощенная обработка данных на больших кластерах»Love.Google/research/Public…

Вы можете посетить? :)

map & flatMap

Эти две функции часто используются. Они имеют следующие отличия:

map

Пучок数组流Для каждого значения в , используйте предоставленную функцию, чтобы выполнить его один раз, однозначное соответствие. получить одинаковое количество элементов数组流.

flatMap

плоский значит плоский. это ставит数组流Для каждого значения в , используйте предоставленную функцию, чтобы выполнить его один раз, однозначное соответствие. получить тот же элемент数组流. Однако элемент внутри также является дочерним数组流. После объединения этих подмассивов в один массив количество элементов, скорее всего, будет таким же, как и исходное.数组流разных чисел.

Производительность программистов

Java8 виды потока

Начиная с java8, была добавлена ​​новая абстракция, называемая потоком: Stream. Благодаря лямбда-синтаксису код можно сделать особенно свежим и чистым.Scala).

Очень хорошее руководство:стек ifengyun.com/streams-expensive…

Операции Spark RDD

Базовой моделью данных Spark является RDD, представляющая собой ориентированный ациклический граф. Он представляет собой неизменяемую разделяемую коллекцию, элементы которой можно вычислять параллельно. Он распространяется, но мы можем посмотреть на следующийWordCountпример.

JavaRDD<String> textFile = sc.textFile("hdfs://...");
JavaPairRDD<String, Integer> counts = textFile
    .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
    .mapToPair(word -> new Tuple2<>(word, 1))
    .reduceByKey((a, b) -> a + b);
counts.saveAsTextFile("hdfs://...");

Какой знакомый API, вы наверняка видели его в Hadoop.

DataStream Флинка

Программы Flink — это обычные программы, которые выполняют преобразование распределенных коллекций (например, фильтрацию, сопоставление, обновление состояния, объединение, группировку, определение окон, агрегирование). Программа DataStream во Flink представляет собой преобразование, реализованное в потоке данных.

Давайте также посмотрим на кусок кода для него.

DataStream<Tuple2<String, Integer>> counts =
// split up the lines in pairs (2-tuples) containing: (word,1)
text.flatMap(new Tokenizer())
// group by the tuple field "0" and sum up tuple field "1"
.keyBy(0).sum(1);

Работа потока кафки

Kafka стала платформой распределенных потоковых вычислений. он абстрагируетKStreamиKTable, который похож на RDD Spark и имеет аналогичные операции.

KStream можно рассматривать как журнал изменений (changlog) KTable, и каждая запись в потоке данных соответствует каждому обновлению в базе данных.

Давайте посмотрим на кусок кода для него.

KTable<String, Long> wordCounts = textLines
.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
.groupBy((key, value) -> value)
.count();
wordCounts.toStream().to("streams-wordcount-output", Produced.with(stringSerde, longSerde));

RxJava

RxJava — это асинхронный фреймворк задач, основанный на шаблоне наблюдателя, который часто используется в разработке под Android (используется все больше и больше серверов).

RxJava внесла некоторые новшества на уровне языка, и у нее есть преданные сторонники.

лямбды на уровне языка

Да конечноHaskellУ этого естественного функционального языка программирования есть свой ореол. Но некоторые другие языки, в том числе языки сценариев, компилируемые языки, также впитали в себя этот опыт.

Все вместе они называются лямбдами.

Python

Как самый популярный язык сценариев, Python также имеет свой лямбда-синтаксис. Также существуют самые основные функции карты, уменьшения, фильтрации и другие функции.

JavaScript

js не может быть снесен, напримерArray.prototype.*()Ждать. Оно должно быть, и оно есть.

End

Их гораздо больше, поэтому я не буду перечислять их по одному. Другими словами, являются ли эти функции патентоспособными? Мне нравится, хоть и редко пользуюсь.