Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在AWS glue上从S3读取csv和文本文件而不必将其作为动态数据帧读取的最佳方法是什么?_Amazon Web Services_Amazon S3_Boto3_Aws Glue - Fatal编程技术网

Amazon web services 在AWS glue上从S3读取csv和文本文件而不必将其作为动态数据帧读取的最佳方法是什么?

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

我正在尝试读取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 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']