我尝试使用SparkSession
从HDFS上的文件夹中读取几个CSV文件(即我不想读取文件夹中的所有文件)
运行时遇到以下错误(最后的代码):
Path does not exist:
file:/home/cloudera/works/JavaKafkaSparkStream/input/input_2.csv,
/home/cloudera/works/JavaKafkaSparkStream/input/input_1.csv
我不想在阅读时使用该模式,例如/home/temp/*.csv
,因为未来我有逻辑从100个CSV文件中选择文件夹中的一个或两个文件
请告知
SparkSession sparkSession = SparkSession
.builder()
.appName(SparkCSVProcessors.class.getName())
.master(master).getOrCreate();
SparkContext context = sparkSession.sparkContext();
context.setLogLevel("ERROR");
Set<String> fileSet = Files.list(Paths.get("/home/cloudera/works/JavaKafkaSparkStream/input/"))
.filter(name -> name.toString().endsWith(".csv"))
.map(name -> name.toString())
.collect(Collectors.toSet());
SQLContext sqlCtx = sparkSession.sqlContext();
Dataset<Row> rawDataset = sparkSession.read()
.option("inferSchema", "true")
.option("header", "true")
.format("com.databricks.spark.csv")
.option("delimiter", ",")
//.load(String.join(" , ", fileSet));
.load("/home/cloudera/works/JavaKafkaSparkStream/input/input_2.csv, " +
"/home/cloudera/works/JavaKafkaSparkStream/input/input_1.csv");
更新
我可以迭代文件并执行如下的联合。如果有更好的方法,请推荐......
Dataset<Row> unifiedDataset = null;
for (String fileName : fileSet) {
Dataset<Row> tempDataset = sparkSession.read()
.option("inferSchema", "true")
.option("header", "true")
.format("csv")
.option("delimiter", ",")
.load(fileName);
if (unifiedDataset != null) {
unifiedDataset= unifiedDataset.unionAll(tempDataset);
} else {
unifiedDataset = tempDataset;
}
}
答案 0 :(得分:3)
您的问题是您正在创建一个值为:
的字符串&#34; /home/cloudera/works/JavaKafkaSparkStream/input/input_2.csv, /home/cloudera/works/JavaKafkaSparkStream/input/input_1.csv"
而是将两个文件名作为参数传递,这应该通过以下方式完成:
.load("/home/cloudera/works/JavaKafkaSparkStream/input/input_2.csv",
"/home/cloudera/works/JavaKafkaSparkStream/input/input_1.csv");
逗号必须在strin之外,你应该有两个值,而不是一个String。
答案 1 :(得分:0)
根据我的理解,你想要从HDFS读取多个文件而不使用像#34; / path / * .csv&#34;这样的正则表达式。您缺少的是每条路径需要单独使用引号并用&#34;分隔,&#34;
您可以使用以下代码阅读,确保您已添加SPARK CSV库:
ngOnInit() {
this.sub = this.route.queryParams
.switchMap(params => {
this.page = +params['page'] || 0;
return this.requestService.getData('posts', '..query string...')
})
.subscribe(data => this.blogs = data.data);
}
答案 2 :(得分:0)
模式也很有帮助。 您想要一次选择两个文件。 如果它们是顺序的,那么你可以做类似的事情
.load("/home/cloudera/works/JavaKafkaSparkStream/input/input_[1-2].csv")
如果有更多文件,那么只需 input_ [1-5] .csv