Ссылка на принятый ответ - 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, а не полагаться на какие-либо сторонние библиотеки.