【问题标题】:Connect AWS S3 to Databricks PySpark将 AWS S3 连接到 Databricks PySpark
【发布时间】:2019-11-04 14:02:18
【问题描述】:

我正在尝试使用 databricks pyspark 从 s3 存储桶连接和读取我的所有 csv 文件。当我使用具有管理员访问权限的存储桶时,它可以正常工作

data_path = 's3://mydata_path_with_adminaccess/'

但是当我尝试连接到一些需要 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 的存储桶时,它将无法工作并且访问被拒绝:

我试过了:

data_path = 's3://mydata_path_without_adminaccess/'

AWS_ACCESS_KEY_ID='my key'
AWS_SECRET_ACCESS_KEY='my key'

和:

data_path = ='s3://<MY_ACCESS_KEY_ID>:<My_SECRET_ACCESS_KEY>@mydata_path_without_adminaccess

【问题讨论】:

    标签: python amazon-s3 pyspark databricks


    【解决方案1】:

    我不确定您是否尝试过使用 secret 和 keys 将存储桶安装在数据块中,但值得尝试:

    这是相同的代码:

    ACCESS_KEY = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
    SECRET_KEY = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
    ENCODED_SECRET_KEY = SECRET_KEY.replace("/", "%2F")
    AWS_BUCKET_NAME = "<aws-bucket-name>"
    MOUNT_NAME = "<mount-name>"
    
    dbutils.fs.mount("s3a://%s:%s@%s" % (ACCESS_KEY, ENCODED_SECRET_KEY, AWS_BUCKET_NAME), "/mnt/%s" % MOUNT_NAME)
    display(dbutils.fs.ls("/mnt/%s" % MOUNT_NAME))
    

    然后您可以像访问本地文件一样访问 S3 存储桶中的文件:

    df = spark.read.text("/mnt/%s/...." % MOUNT_NAME)
    

    补充参考:

    https://docs.databricks.com/data/data-sources/aws/amazon-s3.html

    希望对你有帮助。

    【讨论】:

    • 谢谢。我也尝试安装,但收到错误“范围不存在秘密:aws 和密钥”。虽然我可以将我的 python 会话与该密钥连接起来!
    【解决方案2】:

    要使用访问密钥将 S3 与数据块连接,您只需将 S3 挂载到数据块上即可。它在数据块中创建指向您的 S3 存储桶的指针。 如果您已经有一个秘密存储在数据块中,请按以下方式检索它:

    access_key = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
    secret_key = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
    

    如果您没有存储在 Databricks 中的秘密,请尝试下面的代码以避免“秘密不存在于范围内”错误

    access_key = "your-access-key"
    secret_key = "your-secret-key"
    
    #Mount bucket on databricks
    encoded_secret_key = secret_key.replace("/", "%2F")
    aws_bucket_name = "s3-bucket-name"
    mount_name = "Mount-Name"
    dbutils.fs.mount("s3a://%s:%s@%s" % (access_key, encoded_secret_key, aws_bucket_name), "/mnt/%s" % mount_name)
    display(dbutils.fs.ls("/mnt/%s" % mount_name))
    

    如下访问您的 S3 数据

    mount_name = "mount-name"
    file_name="file name "
    df = spark.read.text("/mnt/%s/%s" % (mount_name , file_name))
    df.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 2018-06-23
      • 2016-09-15
      • 2023-01-07
      • 2021-08-27
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多