Spark 2.3 Java=リスト引数を渡して、データセットds
の複数の列を選択するにはどうすればよいですか?
たとえば、これは正常に動作します。
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>
に変換し、sparkのドキュメントに従ってselectExpr
を使用する必要があります。
select
を使用する場合は、リストから最初の列を削除し、それをパラメーターとしてselect
に追加する必要があります。
2つのバージョンを見つけてください。
次の.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);
}
}
それが役に立てば幸い :)
どちらか 使用
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);