簡體   English   中英

從Spark中具有不同標題的CSV文件形成DataFrame

[英]Forming DataFrames from CSV files with different headers in Spark

我正在嘗試讀取帶有變量列表的Gzip CSV文件夾(無擴展名)。 例如:

CSV file 1: TIMESTAMP | VAR1 | VAR2 | VAR3

CSV file 2: TIMESTAMP | VAR1 | VAR3

每個文件代表一天。 列的順序可以不同(或者一個文件中可能缺少列)。

放棄使用spark.read一次讀取整個文件夾的第一個選項,因為文件之間的spark.read考慮的是列順序,而不是列名稱。 我的下一個選擇是按文件讀取:

 for (String key : pathArray) {
       Dataset<Row> rawData = spark.read().option("header", true).csv(key);
       allDatasets.add(rawData);
    }

然后對列名稱執行完全外部聯接:

Dataset<Row> data = allDatasets.get(0);
     for (int i = 1; i < allDatasets.size(); i++) {
        ArrayList<String> columns = new 
        ArrayList(Arrays.asList(data.columns()));
        columns.retainAll(new  
        ArrayList(Arrays.asList(allDatasets.get(i).columns())));
        data = data.join(allDatasets.get(i), 
        JavaConversions.asScalaBuffer(columns), "outer");
      }

但是此過程非常緩慢,因為它一次加載一個文件。

下一種方法是將sc.binaryFilessc.readFiles一起使用, sc.readFiles添加自定義Hadoop編解碼器的問題(以便能夠讀取不帶gz擴展名的Gzipped文件)。

使用最新的方法並將此代碼轉換為Java,我有以下幾點:

  • 一個JavaPairRDD<String, Iterable<Tuple2<String, String>>>包含變量名( VAR1 )和該VAR的元組TIMESTAMP,VALUE的可迭代項。

我想以此構成一個代表所有文件的DataFrame,但是我完全不知道如何將最終的PairRDD轉換為Dataframe。 DataFrame應該一起代表所有文件的內容。 我想要的最終DataFrame的示例如下:

  TIMESTAMP | VAR1 | VAR2 | VAR3 
   01           32      12    32  ==> Start of contents of file 1
   02           10       5     7  ==> End of contents of file 1
   03                    1     5  ==> Start of contents of file 2
   04                    4     8  ==> End of contents of file 2

有什么建議或想法嗎?

最終,我獲得了很好的性能:

  1. 在“后台”中按月讀取(使用Java Executor以CSV並行讀取其他文件夾),這種方法減少了Driver掃描每個文件夾的時間,因為它是並行進行的。
  2. 接下來,該過程是一方面提取標頭,另一方面提取其內容(具有varname,timestamp,value的元組)。
  3. 最后,使用RDD API合並內容,並使用標題創建Dataframe。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM