Каков наилучший способ чтения csv и текстового файла из S3 на AWS клею без необходимости читать его как динамический c daataframe? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь прочитать CSV-файл, который находится в моем S3 ведро. Я хотел бы сделать некоторые манипуляции, а затем, наконец, преобразовать в динамический c фрейм данных и записать его обратно в S3.

Это то, что я пробовал до сих пор:

Pure Python :

     Val1=""
     Val2=""
     cols=[]
     width=[]
     with open('s3://demo-ETL/read/data.csv') as csvfile:
     readCSV = csv.reader(csvfile, delimiter=',')
     for row in readCSV:
         print(row)
              if ((Val1=="" ) & (Val2=="")):
                 Val1=row[0]
                 Val2=row[0]
                 cols.append(row[1])
                 width.append(int(row[4]))
    else:
         continues...

Здесь я получаю сообщение об ошибке, в котором говорится, что он вообще не может найти файл в каталоге.

Boto3:

     import boto3

     s3 = boto3.client('s3')
     data = s3.get_object(Bucket='demo-ETL', Key='read/data.csv')
     contents = data['Body'].read()
     print(contents)
          for row in content:
               if ((Val1=="" ) & (Val2=="")):
                 Val1=row[0]
                 Val2=row[0]
                 cols.append(row[1])
                 width.append(int(row[4]))
    else:
    continues...

Здесь указано, что индекс вне диапазона, что странно, потому что у меня есть 4 значения через запятую в файле CSV. Когда я смотрю на результаты печати (содержимое), я вижу, что он помещает каждый символ в список, а не помещает каждое значение, разделенное запятыми, в список.

Есть ли лучший способ прочитать csv из s3?

Ответы [ 3 ]

0 голосов
/ 11 января 2020

Я решил эту проблему, прочитав pandas фрейм данных. Сначала я создал объект с помощью boto3, затем прочитал весь объект как pd, который затем преобразовал в список.

       s3 = boto3.resource('s3') 
       bucket = s3.Bucket('demo-ETL')
       obj = bucket.Object(key='read/data.csv') 
       dataFrame = pd.read_csv(obj.get()['Body'])
       l = dataFrame.values.tolist()
           for i in l:
           print(i)
0 голосов
/ 13 января 2020

Вы можете использовать Spark для чтения файла следующим образом:

df = spark.read.\
           format("csv").\
           option("header", "true").\
           load("s3://bucket-name/file-name.csv")

Вы можете найти больше вариантов здесь: https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark. sql .DataFrameReader.csv

0 голосов
/ 09 января 2020

get_object возвращает значение ответа Body типа StreamingBody. Согласно документам, если вы пытаетесь go построчно, вы, вероятно, захотите использовать iter_lines.

Например:

import boto3

s3 = boto3.client('s3')
data = s3.get_object(Bucket='demo-ETL', Key='read/data.csv')
file_lines = data['Body'].iter_lines()
print(file_lines)

Это, вероятно, делает больше того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...