将数据从 databricks 内的数据帧存储到 S3 存储桶

时间:2021-02-26 21:18:52

标签: python amazon-web-services apache-spark amazon-s3 databricks

我的 Python 代码中有一个 Dataframe,它在 databricks 笔记本中运行,其中填充了我从 Spotify API 获得的数据。我将从api获得的数据存储到数据框中。 现在我想将此数据带到 AWS S3。我尝试了 dbutils.fs.put 和 boto3 s3.Bucket(BUCKET_NAME).put_object,但由于现在只能从我的 S3 存储桶中读取数据,因此当我尝试向其写入内容时,总是会遇到问题。我不知道如何存储数据框中的数据。我想将它作为 csv 保存到 databricks 文件存储并从那里上传。但是当我尝试上传文件时,我不知道如何正确设置路径。

使用 boto3 我尝试过

data = open('/dbfs:/FileStore/tables/example.csv', 'rb')

s3.Bucket(BUCKET_NAME).put_object(Key='dbfs:/FileStore/tables/example.csv', Body=data)

但出现以下错误: FileNotFoundError:回溯(最近一次调用最后一次)

<块引用>

在 ----> 1 data = open('/dbfs:/FileStore/tables/example.csv', 'rb') 2 3 s3.Bucket(BUCKET_NAME).put_object(Key='dbfs:/FileStore/tables/example.csv', 正文=数据)

FileNotFoundError: [Errno 2] 没有这样的文件或目录: '/dbfs:/FileStore/tables/example.csv'

使用 dbutils 我尝试过:

dbutils.fs.put(s"/mnt/$s3data", "dbfs:/FileStore/tables/example.csv")

但得到:

<块引用>

语法错误:无效语法

我正在尝试的是,建立一个数据管道,我可以在其中加载来自 Spotify 的数据,检查它(我已经实现了)并将其存储到 S3,以便稍后在不同的笔记本中使用它进行一些评估。

1 个答案:

答案 0 :(得分:0)

您只需要将数据从 Spark 管道直接写入 S3,无需先将其存储到 DBFS。有两种方法:

  1. 直接使用 s3://bucket.../path... 作为参数存储数据到 save
  2. 将您的 S3 存储桶安装为 DBFS,并指向 save 中的该位置

在您的情况下,Boto3 不起作用,因为您使用了需要本地文件的 Boto3 无法理解的 dbfs:/... 语法。您仍然可以通过将 dbfs:/ 替换为 /dbfs/ 来解决它 - 这就是所谓的 FUSE 安装...

dbutils.fs.put 用于将应该作为第二个参数的内容放入给定文件中,而不是复制文件 - 为此您可以使用 dbutils.fs.cp 命令。

但我建议使用开头描述的两种方法之一。