Получение ключевого потока из пользовательского разбиения в Flink

#apache-flink #data-partitioning

#apache-flink #разделение данных

Вопрос:

Я знаю, что Flink поставляется с пользовательскими API-интерфейсами разбиения. Однако проблема в том, что после вызова partitionCustom a DataStream вы получаете DataStream back, а не a KeyedStream .

С другой стороны, вы не можете переопределить стратегию разбиения для a KeyedStream .

Я действительно хочу использовать KeyedStream , потому что API for DataStream не имеет reduce sum операторов and и из-за автоматически разделенного внутреннего состояния.

Я имею в виду, если количество слов равно:

 words.map(s -> Tuple2.of(s, 1)).keyBy(0).sum(1)
  

Хотел бы я написать:

 words.map(s -> Tuple2.of(s, 1)).partitionCustom(myPartitioner, 0).sum(1)
  

Есть ли какой-либо способ добиться этого?

Спасибо!

Ответ №1:

Из документации Flink (начиная с версии 1.2.1), что делают разделители, так это разделяют данные физически по своим ключам, указывая только их местоположения, хранящиеся в разделе физически на компьютере, которые на самом деле логически не сгруппировали данные в keyed stream. Чтобы выполнить суммирование, нам все равно нужно сгруппировать их по ключам, используя оператор «keyBy», тогда нам разрешено выполнять операции «sum». Подробности, пожалуйста, см. «https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html#physical-partitioning » 🙂