簡體   English   中英

從 S3 存儲桶中讀取大量 CSV 文件

[英]Read large number of CSV files from S3 bucket

我想從 S3 存儲桶中讀取大量 csv 文件。 CSV 文件位於不同的分區中。 我正在使用 Boto3 列出所有 csv 路徑。 然后使用 for 循環迭代列表以將 csv 文件讀入 spark 數據幀。 我需要一種更好的優化方法來從 S3 路徑讀取大量文件,因為循環是一種線性方法,需要大量時間才能完成。 列出所有對象:

self.all_objects = [file_path['Key'] for resp_content in self.s3.get_paginator("list_objects_v2").paginate(Bucket='bucketName') for file_path in resp_content['Contents']]

循環讀取每個 CSV 文件:

csv_df = self.spark.read.format("csv").option("header", "true").load(s3_path)

此外,我想將所有數據框合並在一起以創建一個鑲木地板文件。

提前致謝,如果有人有一個好的解決方案,請提出建議。

讀取包含多個文件夾的 csv 文件(Spark + Scala):

import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}

val sourcesFolders = List("/home/mykolavasyliv/tmp/source1/", "/home/mykolavasyliv/tmp/source2/", "/home/mykolavasyliv/tmp/source3/")

//  :~/tmp$ tree
//    .
//  ├── source1
//  │   └── person-data-1.csv
//  ├── source2
//  │   └── person-data-2.csv
//  └── source3
//      └── person-data-3.csv

//  person-data-1.csv:
//  source-1-1,Mykola ,23,100
//  source-1-2,Jon,34,76
//  source-1-3,Marry,25,123

//  person-data-2.csv
//  source-2-1,Mykola ,23,100
//  source-2-2,Jon,34,76
//  source-2-3,Marry,25,123

//  person-data-3.csv
//  source-3-1,Mykola ,23,100
//  source-3-2,Jon,34,76
//  source-3-3,Marry,25,123




// Read csv files not use schema

val sourceDF = spark.read.csv(sourcesFolders:_*)

sourceDF.show(false)
//  +----------+-------+---+---+
//  |_c0       |_c1    |_c2|_c3|
//  +----------+-------+---+---+
//  |source-1-1|Mykola |23 |100|
//  |source-1-2|Jon    |34 |76 |
//  |source-1-3|Marry  |25 |123|
//  |source-2-1|Mykola |23 |100|
//  |source-2-2|Jon    |34 |76 |
//  |source-2-3|Marry  |25 |123|
//  |source-3-1|Mykola |23 |100|
//  |source-3-2|Jon    |34 |76 |
//  |source-3-3|Marry  |25 |123|
//  +----------+-------+---+---+



// Read csv files use schema

val schema = StructType(
  List(
    StructField("id", StringType, true),
    StructField("name", StringType, true),
    StructField("age", IntegerType, true),
    StructField("NotKnow", IntegerType, true)
  )
)

val source2DF = spark.read.schema(schema).csv(sourcesFolders:_*)

source2DF.show(false)
//  +----------+-------+---+-------+
//  |id        |name   |age|NotKnow|
//  +----------+-------+---+-------+
//  |source-1-1|Mykola |23 |100    |
//  |source-1-2|Jon    |34 |76     |
//  |source-1-3|Marry  |25 |123    |
//  |source-2-1|Mykola |23 |100    |
//  |source-2-2|Jon    |34 |76     |
//  |source-2-3|Marry  |25 |123    |
//  |source-3-1|Mykola |23 |100    |
//  |source-3-2|Jon    |34 |76     |
//  |source-3-3|Marry  |25 |123    |
//  +----------+-------+---+-------+

暫無
暫無

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

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