如何在python中的S3中从pandas数据帧写入镶木地板文件

Ale*_*der 9 amazon-s3 python-3.x parquet

我有一个熊猫数据框。我想将此数据帧写入S3中的镶木地板文件中。我需要相同的示例代码。我尝试用Google搜索它。但我无法获得有效的示例代码。

gur*_*eek 12

下面的函数在缓冲区中获取拼花输出,然后将 buffer.values() 写入 S3,无需在本地保存拼花

此外,由于您正在创建 s3 客户端,因此您可以使用 aws s3 密钥创建凭据,这些密钥可以存储在本地、气流连接或 aws 机密管理器中

def dataframe_to_s3(s3_client, input_datafame, bucket_name, filepath, format):

        if format == 'parquet':
            out_buffer = BytesIO()
            input_datafame.to_parquet(out_buffer, index=False)

        elif format == 'csv':
            out_buffer = StringIO()
            input_datafame.to_parquet(out_buffer, index=False)

        s3_client.put_object(Bucket=bucket_name, Key=filepath, Body=out_buffer.getvalue())
Run Code Online (Sandbox Code Playgroud)

S3_client 只不过是一个 boto3 客户端对象。希望这会有所帮助!

礼貌- /sf/answers/2843094131/


Vin*_*aes 11

对于 python 3.6+,AWS 有一个名为aws-data-wrangler的库,可以帮助 Pandas/S3/Parquet 之间的集成

安装做;

pip install awswrangler
Run Code Online (Sandbox Code Playgroud)

如果您想将您的 Pandas 数据帧作为镶木地板文件写入 S3,请执行;

import awswrangler as wr
wr.s3.to_parquet(
    dataframe=df,
    path="s3://my-bucket/key/my-file.parquet"
)
Run Code Online (Sandbox Code Playgroud)

  • 注意:与 pandas.DataFrame.to_parquet() 不同,wrangler 没有选项将 kwargs 传递到底层 parquet 库。这意味着您无法根据需要设置较低级别的选项。当 PyArrow 无法推断表模式时,我遇到了这个问题 - 在 pandas 中,您可以通过[显式定义](/sf/answers/4676405121/) PyArrow 模式来解决此问题 (4认同)

Wai*_*iat 7

供您参考,我具有以下代码。

s3_url = 's3://bucket/folder/bucket.parquet.gzip'
df.to_parquet(s3_url, compression='gzip')
Run Code Online (Sandbox Code Playgroud)

为了使用to_parquet,您需要pyarrowfastparquet将被安装。另外,请确保您在configcredentials文件.aws夹中的文件中具有正确的信息。

编辑:另外,s3fs是必需的。参见/sf/answers/3780485971/

  • 我的 .aws/config 和凭证文件中有多个配置文件...有没有办法设置要使用哪个配置文件?(我想设置我的 ENV var: AWS_PROFILE=<blah> 会起作用,但最好在代码中做到这一点) (4认同)
  • 是的,您首先导入 `boto3`,然后使用 `session = boto3.Session(profile_name={your_profile}")` 设置您的个人资料 (4认同)
  • 为了完整起见,如果您想要 `.parquet` 作为输出文件,请删除压缩参数并将文件名更改为 `.parquet`: `s3_url = 's3://bucket/folder/bucket.parquet' df.to_parquet( s3_url) ` (4认同)

小智 6

我们可以将pyarrowboto3结合在一起。

快速示例代码:

def main():
    data = {0: {"data1": "value1"}}
    df = pd.DataFrame.from_dict(data, orient='index')
    write_pandas_parquet_to_s3(
        df, "bucket", "folder/test/file.parquet", ".tmp/file.parquet")


def write_pandas_parquet_to_s3(df, bucketName, keyName, fileName):
    # dummy dataframe
    table = pa.Table.from_pandas(df)
    pq.write_table(table, fileName)

    # upload to s3
    s3 = boto3.client("s3")
    BucketName = bucketName
    with open(fileName) as f:
       object_data = f.read()
       s3.put_object(Body=object_data, Bucket=BucketName, Key=keyName)
Run Code Online (Sandbox Code Playgroud)

  • import pyarrow as pa , import pyarrow.parquet as pq 是需要的。 (3认同)
  • 通过导入,您的示例看起来会更干净。我还认为,如果您添加使用 BytesIO 作为缓冲区的第二个示例,您会获得更多分数。 (2认同)

归档时间:

查看次数:

8249 次

最近记录:

6 年,1 月 前