Spark Session读取多个文件而不是使用模式

时间:2017-08-14 18:01:29

标签: apache-spark apache-spark-sql apache-spark-dataset apache-spark-2.0

我尝试使用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;
        }
    }

3 个答案:

答案 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