【问题标题】:Uploading a file from databricks dbfs / local to an S3 bucket. How do i upload a file from databricks to S3 bucket using boto3 library or mounting s3?将文件从 databricks dbfs / local 上传到 S3 存储桶。如何使用 boto3 库或挂载 s3 将文件从 databricks 上传到 S3 存储桶?
【发布时间】:2020-10-24 02:34:59
【问题描述】:

我尝试了以下几种在 S3 中上传文件的方法 这最终导致存储的不是数据而是路径 数据。

import boto3
s3 = boto3.resource('s3')

s3 = boto3.client(
    's3',
    aws_access_key_id="key_id",
    aws_secret_access_key="access_key")

s3.Object('bucket/folder/','xyz.csv').upload_file(Filename='/mnt/folder/xyz.csv')

--> 给我一个错误 FileNotFoundError: [Errno 2] No such file or directory: '/mnt/folder/xyz.csv'


s3.put_object(Body='/databricks/driver/xyz.csv', Bucket='bucket', Key='folder/xyz.csv')

--> 成功执行,但打开文件时只包含这个字符串 - '/databricks/driver/xyz.csv'


s3.Object('bucket', 'folder/xyz.csv').put(Body="/FileStore/folder/xyz.csv")

--> 成功执行,但打开文件时只包含这个字符串 - '/FileStore/folder/xyz.csv'


bucket = s3.Bucket('bucket')
s3.Object('bucket/folder', 'xyz.csv').put(Body=open('/FileStore/folder/xyz.csv', 'rb'))

--> 给我一个错误FileNotFoundError: [Errno 2] No such file or directory: '/mnt/folder/xyz.csv'


with open('/mnt/folder/xyz.csv', "rb") as f:
    s3.upload_fileobj(f, 'bucket', 'folder/xyz.csv')

--> 给我一个错误FileNotFoundError: [Errno 2] No such file or directory: '/mnt/folder/xyz.csv'


s3.meta.client.upload_file('/mnt/folder/xyz.csv', 'bucket', 'folder/xyz.csv')

--> 给我一个错误FileNotFoundError: [Errno 2] No such file or directory: '/mnt/folder/xyz.csv'


如果有任何拼写错误或语法错误,或者是否需要更改问题的结构,请告诉我。谢谢!

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto3 databricks


    【解决方案1】:

    下面的代码对我来说很好用

    import boto3
    from botocore.client import Config
    ACCESS_KEY = 'YOUR_ACCESS_KEY'
    SECRET_KEY = 'YOUR_SECRET_KEY'
    AWS_BUCKET_NAME = "BUCKET_NAME"
    
    s3 = boto3.resource('s3', aws_access_key_id = ACCESS_KEY, aws_secret_access_key 
    =SECRET_KEY, config = Config(signature_version = 's3v4') )
    
    s3.meta.client.upload_file( '/dbfs/FileStore/filename.csv', AWS_BUCKET_NAME, 
    "filename.csv")
    

    【讨论】:

      【解决方案2】:

      我找到了我的问题的答案 -

      1. 我没有使用 put_object,而是使用了 upload_file()

      2. 其次,总是从 dbfs(databricks 文件系统)读取时 在文件夹结构名称前加上 "/dbfs"

      记住正斜杠 (/) 很重要


      import boto3
      s3_client = boto3.client('s3')
      response = s3_client.upload_file('/dbfs/FileStore/folder/'xyz.csv', 'bucket', 'folder/'xyz.csv' )
      

      【讨论】:

        猜你喜欢
        • 2018-02-07
        • 1970-01-01
        • 2018-06-02
        • 2018-04-25
        • 2017-03-02
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多