При наличии набора данных <Row>существует ли функция API, которая принимает строку для добавления столбца? - PullRequest
0 голосов
/ 04 июля 2018

Я ищу API, который позволил бы мне добавить столбец на основе вывода функций, который имеет доступ ко всей строке . Это было бы похоже на возможность вызова Dataset # filter (FilterFunction)

В качестве примера предположим, что у меня есть следующий DF

+----+----+----+
| c0 | c1 | c2 |
+----+----+----+
| 1  | 2  | 3  |
+----+----+----+

Я хотел бы иметь возможность создать новый столбец

df.withColumn("c3", row ->
  row.getInt(0) + row.getInt(1) + row.getInt(2));

И результат

+----+----+----+----+
| c0 | c1 | c2 | c3 |
+----+----+----+----+
| 1  | 2  | 3  | 6  |
+----+----+----+----+

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

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать map:

map(MapFunction<T,U> func, Encoder<U> encoder)

и перестройте целое Row, или объедините все нужные вам столбцы с struct и используйте udf:

import static org.apache.spark.sql.functions.*;

UserDefinedFunction f = udf(
  (Row row) -> row.getInt(0) + row.getInt(1) + row.getInt(2), 
  DataTypes.IntegerType
);


df.withColumn("c3", f(struct(col("c1"), col("c2"), col("c3"))));

, но оба метода будут значительно менее эффективными, чем использование стандартных выражений SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...