В Java API Spark, как я могу выбрать столбцы из набора данных <Row>с помощью регулярных выражений? - PullRequest
0 голосов
/ 04 июня 2019

Ссылка на принятый ответ - https://stackoverflow.com/a/56447083/8543652

Используя Java API Spark, я хочу выбрать поднабор столбцов из существующего набора данных с помощью регулярного выражения и поместить их в новый набор данных.

Например, предположим, у меня есть набор данных с большим количеством столбцов:

String[] columnNames = exampleDF.columns();

, где

columnNames = {foo1,foo2,...,foon,bar1,bar2,...,bark}

Предположим, исходя из вышесказанного, я хочу создать новый набор данных из exampleDF, содержащий только столбцы foo.

До сих пор я пытался создать вспомогательную функцию регулярного выражения с использованием простой Java, а затем попытался поместить ее в метод выбора набора данных:

String[] filterColumns(Dataset<Row> inputDF, String regEx){

      // Get the column names, convert to a stream of strings
      Stream<String> columnStream = Arrays.stream(inputDF.columns());

      // Create a predicate from the desired regular expression
      Predicate<String> pred = Pattern.compile(regEx).asPredicate(); 

      // Filter the streamed string based on the predicate, then convert to an array
      return columnStream.filter(pred).collect(Collectors.toList()).toArray(new String[0]);

Dataset<Row> outputDF = exampleDF.select(filterColumns(exampleDF, "foo."));

Я понимаю, что varargs может принимать массив в качестве входных данных, и я надеялся, что функция select примет указанный массив. Как ни странно, кажется, что сначала нужно ввести строку, а затем строку vararg.

Например, если вместо этого моя вспомогательная функция выведет массив в виде:

String[] cumbersomeArray = {foo2,foo3,...,foon} 

Я мог бы ввести:

Dataset<Row> outputDF = exampleDF.select("foo1",filterColumns(outputDF, cumbersomeArray))

и это сработало бы.

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

Я также попробовал метод selectExpr, но, похоже, он принимает только SQL-подобное выражение.

Мне также известен метод colRegex в Dataset, но я не смог найти никаких примеров или документации (фактически, именно поэтому я решил попробовать и реализовать свою собственную вспомогательную функцию).

Мои вопросы, таким образом, следующие:

1) Можно ли изменить мою вспомогательную функцию для вывода строки, за которой следует строка [], чтобы я мог поместить ее прямо в метод выбора набора данных?

2) Или же моя текущая вспомогательная функция будет работать как-то внутри какого-то другого метода?

3) Поможет ли мне здесь colRegex или другой метод, о котором я не знаю? Если да, можете ли вы предоставить пример и документацию?

Я бы предпочел придерживаться нативных объектов Java / Spark, а не полагаться на какие-либо сторонние библиотеки.

1 Ответ

0 голосов
/ 04 июня 2019

Используемый здесь метод Dataset select - select(String col, String... cols), но вместо этого можно использовать метод select(Column... cols), возвращая массив Columns из вспомогательной функции, а не массив String .

изменить на:

return columnStream.filter(pred).map(x -> new Column(x)).collect(Collectors.toList()).toArray(new Column[0])

тогда вы можете просто использовать возвращенный массив как:

Dataset<Row> outputDF = exampleDF.select(filterColumns(outputDF, cumbersomeArray))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...