Amazon web services 在AWS glue上从S3读取csv和文本文件而不必将其作为动态数据帧读取的最佳方法是什么?
我正在尝试读取S3存储桶中的csv文件。我想做一些操作,然后最终转换成动态数据帧并将其写回S3 这就是我迄今为止所尝试的: 纯Python:Amazon web services 在AWS glue上从S3读取csv和文本文件而不必将其作为动态数据帧读取的最佳方法是什么?,amazon-web-services,amazon-s3,boto3,aws-glue,Amazon Web Services,Amazon S3,Boto3,Aws Glue,我正在尝试读取S3存储桶中的csv文件。我想做一些操作,然后最终转换成动态数据帧并将其写回S3 这就是我迄今为止所尝试的: 纯Python: Val1="" Val2="" cols=[] width=[] with open('s3://demo-ETL/read/data.csv') as csvfile: readCSV = csv.reader(csvfile, delimiter=',') for row in re
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...
这里它说索引超出了范围,这很奇怪,因为我在csv文件中有4个逗号分隔的值。当我查看打印结果(内容)时,我看到它将每个字符放在一个列表中,而不是将每个逗号分隔的值放在一个列表中
是否有更好的方法从s3读取csv?返回类型为的正文
响应值。根据文档,如果你想一行一行地去做,你可能想使用
例如:
导入boto3
s3=boto3.client('s3')
data=s3.get_对象(Bucket='demo-ETL',Key='read/data.csv')
文件行=数据['Body'].iter行()
打印(文件行)
这可能会做更多您想要的事情。我最终解决了这个问题,将其作为一个数据帧来阅读。我首先用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)
您可以使用Spark如下方式读取文件:
df = spark.read.\
format("csv").\
option("header", "true").\
load("s3://bucket-name/file-name.csv")
您可以在此处找到更多选项:您是否尝试过pandas或spark数据帧,即df=spark.read.csv(“s3://demo-ETL/read/data.csv”)?我尝试了spark dataframe,这似乎不是最好的选择。但是dataframe起作用了。它读取文件并以字符串形式打印每行数据。我希望每一行都在一个列表中,这样我就可以像上面的for循环那样迭代它们。我在本地做了这件事,我正在寻找一种在胶水上做这件事的等效方法
将open('data.csv')作为csvfile:readCSV=csv.reader(csvfile,delimiter=','),用于readCSV:print(rows)
中的行。这会像这样打印出每一行['name','age','2','54','9']