首页 > 解决方案 > 如何在数据框中动态地从列表中选择列以及固定列

问题描述

我在 java8 中使用 spark-sql-2.4.1v。

我有动态的列列表被传递到我的函数中。

IE

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)

标签: javadataframeapache-sparkapache-spark-sql

解决方案


您可以创建 Columns 数组并将其传递给 select 语句。

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();

推荐阅读