У меня 1000 записей в теме. Я пытаюсь отфильтровать записи из темы ввода в тему вывода на основе зарплаты.

Например: я хочу записи людей, чья зарплата выше, чем 30 000 человек.
Я пытаюсь использовать Kstreams, используя Java для этого.

Записи представлены в текстовом формате (через запятую), например:

first_name, last_name, email, gender, ip_address, country, salary
Redacted,Tranfield,user@example.com,Female,45.25.XXX.XXX,Russia,$12345.01
Redacted,Merck,user@example.com,Male,236.224.XXX.XXX,Belarus,$54321.96
Redacted,Kopisch,user@example.com,Male,61.36.XXX.XXX,Morocco,$12345.05
Redacted,Edds,user@example.com,Male,6.87.XXX.XXX,Poland,$54321.72
Redacted,Alston,user@example.com,Female,56.146.XXX.XXX,Indonesia,$12345.16
...

Это мой код:

public class StreamsStartApp {
public static void main(String[] args) {
System.out.println();
Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-starter-app");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG,   Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

StreamsBuilder builder = new StreamsBuilder();

// Stream from Kafka topic
KStream<Long, Long> newInput = builder.stream("word-count-input");
Stream<Long, Long> usersAndColours = newInput
// step 1 - we ensure that a comma is here as we will split on it
.filter(value -> value.contains(",")
// step 2 - we select a key that will be the user id
.selectKey((key, value) -> value.split(",")[6])

// step 3 - got stuck here. 
// .filter(key -> key.value[6] > 30000 
// .selectKey((new1, value1) -> value1.split)(",")[3])
//  .filter((key, value) -> key.greater(10));
//    .filter((key, value) -> key > 10);
// .filter(key -> key.getkey().intValue() > 10);
usersAndColours.to("new-output");
Runtime.getRuntime().addShutdownHook(new Thread(streams::close))  

Здесь, в этом выше, код рядом с шагом 1, я отделил данные образца, используя «,».
На шаге 2 я выбрал одно поле I.E.: Поле заработной платы как ключ.
Теперь на шаге 3 я пытаюсь отфильтровать данные с использованием полей заработной платы.
Я попробовал несколько способов, которые прокомментированы, но ничего не работало.
Любые идеи помогут.

0
Outlander 7 Мар 2018 в 23:13

1 ответ

Лучший ответ

Во-первых, ваш ключ и значение - это строковые значения, а не длинные, поэтому KStream<Long, Long> неверно.

И value.split(",")[6] это просто строка, а не двойная. (или длинный, так как есть десятичные значения)

Вам нужно удалить $ из столбца и преобразовать строку в Double, после чего вы сможете фильтровать по ней. Также это не key.value[6], потому что ваш ключ не является объектом с полем значения.

И вы, вероятно, должны сделать электронное письмо ключом, а не зарплату, если вам даже нужен ключ, то есть

Реально, вы можете сделать это одной строкой (здесь сделали две для удобочитаемости)

newInput.filter(value -> value.contains(",")  && 
    Double.parseDouble(value.split(",")[6].replace("$", "")) > 30000);
1
OneCricketeer 8 Мар 2018 в 10:43