Как выбрать несколько столбцов набора данных, учитывая список имен столбцов? - PullRequest
0 голосов
/ 04 декабря 2018

Как выбрать несколько столбцов набора данных ds в Java Spark 2.3, передав аргумент списка?

Например, это работает нормально:

ds.select("col1","col2","col3").show();

Однако это не удается:

List<String> columns = Arrays.toList("col1","col2","col3");
ds.select(columns.toString()).show()

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Используя spark 2.4.0, вы должны преобразовать List<String> в Seq<String> и использовать selectExpr, следуя документации по искрам.

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

Найдите две версии:

Предположим, у вас есть следующий .csv файл:

InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
536365,85123A,WHITE HANGING HEART T-LIGHT HOLDER,6,2010-12-01 08:26:00,2.55,17850.0,United Kingdom
536365,71053,WHITE METAL LANTERN,6,2010-12-01 08:26:00,3.39,17850.0,United Kingdom
536365,84406B,CREAM CUPID HEARTS COAT HANGER,8,2010-12-01 08:26:00,2.75,17850.0,United Kingdom
536365,84029G,KNITTED UNION FLAG HOT WATER BOTTLE,6,2010-12-01 08:26:00,3.39,17850.0,United Kingdom
536365,84029E,RED WOOLLY HOTTIE WHITE HEART.,6,2010-12-01 08:26:00,3.39,17850.0,United Kingdom

Вы можете использовать этот код для решения вашей проблемы:

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

import java.util.Arrays;
import java.util.List;
import scala.collection.JavaConverters;
import scala.collection.Seq;


public class SparkJavaTest {
    public static SparkSession spark = SparkSession
            .builder()
            .appName("JavaSparkTest")
            .master("local")
            .getOrCreate();

    public static Seq<String> convertListToSeq(List<String> inputList) {
        return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
    }

    public static void main(String[] args) {
        Dataset<Row> ds = spark.read().option("header",true).csv("spark-file.csv");

        List<String> columns = Arrays.asList("InvoiceNo","StockCode","Description");
        //using selectExpr
        ds.selectExpr(convertListToSeq(columns)).show(false);

        //using select => this first column will be added to select
        List<String> columns2 = Arrays.asList("StockCode","Description");

        ds.select("InvoiceNo", convertListToSeq(columns2)).show(false);

    }
}

Надеюсь, это поможет:)

0 голосов
/ 04 декабря 2018

Либо используйте

Dataset<Row>  select(String col, scala.collection.Seq<String> cols)

как

Column column = "col1";
List<String> columns = Arrays.toList(""col2","col3");
ds.select(column, columns).show()

или

 Dataset<Row> select(String col, String... cols)

как

List<Column> columns = Arrays.toList(col("col1"),col("col2"),col("col3"));
ds.select(columns);
...