Spark 2.2.0加载指定文件列表调用csv API报错咨询
解决Spark csv API重载方法匹配报错的问题
这个问题我之前也踩过坑,本质是Spark的DataFrameReader.csv方法没有直接接受scala.collection.Seq<String>的重载版本,编译器没法自动匹配到合适的重载,所以才抛出了这个报错。下面给你两种直接可行的解决办法:
方法一:将Seq转换为可变参数(String*)
Spark的csv方法支持接收可变参数的路径列表,你只需要把Seq转换成可变参数格式即可:
Scala代码示例
// 假设paths是你已经筛选好的scala.collection.Seq<String> val df = spark.read.csv(paths: _*)
这里的:_*是Scala的语法糖,用来把Seq转换成可变参数,让编译器匹配到(paths: String*)这个重载方法。
Java代码示例
如果是在Java环境下调用,需要先把Scala的Seq转成Java数组,再传递给csv方法(Java的可变参数本质是数组):
// 假设paths是scala.collection.Seq<String>类型 String[] pathArray = paths.toArray(new String[0]); Dataset<Row> df = spark.read().csv(pathArray);
方法二:将Seq转换为Dataset
另一种方式是把路径Seq包装成Spark的Dataset,然后传给接收Dataset<String>的csv重载方法:
Scala代码示例
import org.apache.spark.sql.Encoders val pathDataset = spark.createDataset(paths)(Encoders.STRING) val df = spark.read.csv(pathDataset)
Java代码示例
import org.apache.spark.sql.Encoders; Dataset<String> pathDataset = spark.createDataset(paths, Encoders.STRING()); Dataset<Row> df = spark.read().csv(pathDataset);
两种方法都能解决你的重载匹配问题,选哪种看你代码的上下文习惯就行~
内容的提问来源于stack exchange,提问作者Béatrice M.
相关产品推荐
相关产品推荐

