как динамически выбирать столбцы из списка в фрейме данных плюс фиксированный столбец - PullRequest
0 голосов
/ 30 марта 2020

Я использую spark- sql -2.4.1v с java8.

У меня есть Dynami c Список столбцов передается в мою функцию.

т.е.

List<String> cols = Arrays.asList("col_1","col_2","col_3","col_4");
Dataset<Row> df = //which has above columns plus "id" ,"name" plus many other columns;

Нужно выбрать cols + "id" + "name"

Я делаю, как показано ниже

Dataset<Row> res_df = df.select("id", "name", cols.stream().toArray( String[]::new)); 

это приводит к ошибке компиляции. Итак, как справиться с этим вариантом использования.

Пробовал:

Когда я делаю что-то вроде ниже:

List<String> cols = new ArrayList<>(Arrays.asList("col_1","col_2","col_3","col_4"));
cols.add("id");
cols.add("name");

Ошибка выдачи

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

Ответы [ 2 ]

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

Вы можете создать массив столбцов и передать его в оператор выбора.

import org.apache.spark.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

List<String> cols = new ArrayList<>(Arrays.asList("col_1","col_2","col_3","col_4"));
cols.add("id");
cols.add("name");
Column[] cols2 = cols.stream()
        .map(s->new Column(s)).collect(Collectors.toList())
        .toArray(new Column[0]);

settingsDataset.select(cols2).show();
1 голос
/ 30 марта 2020

У вас есть несколько способов добиться этого, полагаясь на разные select сигнатуры методов.

Одно из возможных решений с предположением cols Список неизменен и не контролируется вашим кодом :

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import scala.collection.JavaConverters;

public class ATest {
    public static void main(String[] args) {
        SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .master("local[2]")
                .getOrCreate();

        List<String> cols = Arrays.asList("col_1", "col_2");

        Dataset<Row> df = spark.sql("select 42 as ID, 'John' as NAME, 1 as col_1, 2 as col_2, 3 as col_3, 4 as col4");
        df.show();

        ArrayList<String> newCols = new ArrayList<>();
        newCols.add("NAME");
        newCols.addAll(cols);
        df.select("ID", JavaConverters.asScalaIteratorConverter(newCols.iterator()).asScala().toSeq())
                .show();
    }
}
...