簡體   English   中英

在Apache Spark中讀取具有多個部分標題且具有可變部分內容的文件

[英]Reading a file with multiple section headers in Apache Spark with variable section content

是否可以使用Spark API讀取包含多個具有不同標題的節的大型 CSV文件? 文件的結構如下

BatchCode#1
Name,Surname,Address
AA1,BBB,CCC
AA2,BBB,CCC
AA3,BBB,CCC

BatchCode#2
Name,Surname,Address,Phone
XY1,BBB,CCC,DDD
XY2,BBB,CCC,DDD
XY3,BBB,CCC,DDD

在讀取記錄時,我們需要注意標頭以及各節之間的文件格式可能不同。 BatchCode信息需要從標題中提取,並且應該是該節中每個記錄的一部分-例如,第1行的數據應解析為:

Name: AAA1
Surname: BBB
Address:CCC
BatchCode:1

我想到以下選項,但我不確定是否會造成重大問題:

  1. 使用WholeTextFile讀取文件。 這將使用單個線程讀取文件,但是它將整個文件加載到內存中,並且可能導致大文件出現內存問題。
  2. 使用sc.textFile上的coalesce(1)強制Spark在單個線程中讀取文件。 我不確定訂單是否總是可以保證的。 一旦將文件獲取為RDD,我們將在讀取文件時緩存標題行並將其與相應的數據記錄合並。

即使上述方法可行,它們是否有效? 什么是最有效的方法?

我只為較復雜的用例編寫了Scala程序,從而保證了順序性。 否則太難了。 如果首先從xls或xlsx發出文件,則通過csvkit處理文件。

以下程序對我有用:

JavaPairRDD<String, PortableDataStream> binaryFiles = sc.binaryFiles(file);

PortableRecordReader reader = new PortableRecordReader();
JavaPairRDD<String, Record> fileAndLines = binaryFiles.flatMapValues(reader);

PortableRecordReader在其中打開DataInputStream並將其轉換為InputStreamReader,然后使用CSV解析器將這些行轉換為Record對象中的預期輸出,並合並標頭。

暫無
暫無

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

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