java - 给定列名列表,如何选择数据集的多列?
问题描述
如何ds
通过传递列表参数在 Spark 2.3 Java 中选择多列数据集?
例如,这很好用:
ds.select("col1","col2","col3").show();
但是,这失败了:
List<String> columns = Arrays.toList("col1","col2","col3");
ds.select(columns.toString()).show()
解决方案
使用spark 2.4.0
您必须将其转换List<String>
为Seq<String>
,并使用selectExpr
以下 spark 文档。
如果要使用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);
}
}
希望能帮助到你 :)
推荐阅读
- c - 在另一台 PC 上运行 C 构建的 .exe
- asp.net-core - GetService 与 ApplicationServices 和 IServiceProvider 有什么区别?
- python - 将自定义用户身份验证添加到 django-rest-framework-simple-jwt
- r - 不从源代码安装软件包的含义?
- r - 在 R 中查询 PostgreSQL 数据库时,如何修复警告消息“关闭打开的结果集,取消先前的查询”?
- java - 如何从 Web 读取 JSON 数据并将插入插入数据库
- ios - iOS VoiceOver 读取accessibilityIdentifier 而不是accessibilityLabel
- c++ - 使用visual studio代码调试c ++代码时出现问题,带有lunch.json文件
- json - 使用 Google APP 脚本在 Google SpreadSheet 中导入 JSON 对象
- asp.net-core - 颤振的 SignalR 集线器连接错误