Есть ли способ написать два вывода набора данных в одном вычислении в Spark - PullRequest
1 голос
/ 06 марта 2020

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

Dataset<Row> input = sparkSession.read().parquet(inputPath);
Dataset<Row> processed = someFunction(input);
Dataset<Row> filtered = processed.filter(someCondition);

processed.write().parquet(outputPath1);
filtered.write().parquet(outputPath2);

I заметил, что во время выполнения кода someFunction () вызывается дважды (один раз во время записи обрабатывается, а другой раз во время записи фильтруется из-за ленивых вычислений в spark). Есть ли способ записать оба выхода (в общем, несколько выходов), используя один вызов someFunction ().

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вы можете сделать это, кэшировав processed:

Dataset<Row> processed = someFunction(input).cache(); //cache
Dataset<Row> filtered = processed.filter(someCondition);

, поскольку фрейм данных, используемый для получения filtered, кэшируется, Spark не нужно будет вызывать someFunction() во второй раз.

1 голос
/ 06 марта 2020

Spark имеет возможность .persist() кадра данных для будущих вычислений. По умолчанию он сохраняет вычисленный информационный кадр в памяти и при необходимости перенаправляет его (временно, на весь срок службы драйвера) на диск.

Dataset<Row> input = sparkSession.read().parquet(inputPath);
Dataset<Row> processed = someFunction(input).persist();
Dataset<Row> filtered = processed.filter(someCondition);

processed.write().parquet(outputPath1);
filtered.write().parquet(outputPath2);
processed.unpersist();
...