![](/img/trans.png)
[英]How to create a generic FlatFileItemReader to read CSV files with different headers?
[英]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.binaryFiles
與sc.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
有什么建議或想法嗎?
最終,我獲得了很好的性能:
Executor
以CSV並行讀取其他文件夾),這種方法減少了Driver
掃描每個文件夾的時間,因為它是並行進行的。 RDD
API合並內容,並使用標題創建Dataframe。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.