我有一种使用boto3(1.4.4),pyarrow(0.4.1)和pandas(0.20.3)实现这一目标的hacky方法.
首先,我可以在本地读取单个镶木地板文件,如下所示:
import pyarrow.parquet as pq
path = 'parquet/part-r-00000-1e638be4-e31f-498a-a359-47d017a0059c.gz.parquet'
table = pq.read_table(path)
df = table.to_pandas()
Run Code Online (Sandbox Code Playgroud)
我也可以在本地读取镶木地板文件目录,如下所示:
import pyarrow.parquet as pq
dataset = pq.ParquetDataset('parquet/')
table = dataset.read()
df = table.to_pandas()
Run Code Online (Sandbox Code Playgroud)
两者都像魅力一样.现在我想用存储在S3存储桶中的文件远程实现相同的功能.我希望这样的东西能起作用:
dataset = pq.ParquetDataset('s3n://dsn/to/my/bucket')
Run Code Online (Sandbox Code Playgroud)
但它没有:
OSError: Passed non-file path: s3n://dsn/to/my/bucket
在仔细阅读了pyarrow的文档后,目前似乎无法做到这一点.所以我提出了以下解决方案:
从S3读取单个文件并获取pandas数据帧:
import io
import boto3
import pyarrow.parquet as pq
buffer = io.BytesIO()
s3 = boto3.resource('s3')
s3_object = s3.Object('bucket-name', 'key/to/parquet/file.gz.parquet')
s3_object.download_fileobj(buffer)
table = pq.read_table(buffer)
df = table.to_pandas()
Run Code Online (Sandbox Code Playgroud)
在这里,我的hacky,not-so-optimized,解决方案从S3文件夹路径创建一个pandas数据框:
import io
import …Run Code Online (Sandbox Code Playgroud) 我安装了已经安装了python(3.6)&anaconda的EC2服务器中的以下模块:
除了fastparquet,其他一切都在导入.当我尝试导入fastparquet时,它会抛出以下错误:
[username@ip8 ~]$ conda -V
conda 4.2.13
[username@ip-~]$ python
Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 12:22:00)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
import fastparquet
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/username/anaconda3/lib/python3.6/site-packages/fastparquet/__init__.py", line 15, in <module>
from .core import read_thrift
File "/home/username/anaconda3/lib/python3.6/site-packages/fastparquet/core.py", line 11, in <module>
from .compression import decompress_data
File "/home/username/anaconda3/lib/python3.6/site-packages/fastparquet/compression.py", line 43, in <module> …Run Code Online (Sandbox Code Playgroud) 目前我正在使用下面的代码Python 3.5, Windows读取parquet文件。
import pandas as pd
parquetfilename = 'File1.parquet'
parquetFile = pd.read_parquet(parquetfilename, columns=['column1', 'column2'])
Run Code Online (Sandbox Code Playgroud)
但是,我想在不使用熊猫的情况下这样做。如何最好地做到这一点?我Python 2.7 and 3.6在Windows.
我想以镶木地板格式在我的 s3 存储桶中写入我的数据帧。我知道如何以 csv 格式编写数据帧。但我不知道如何以镶木地板格式书写。这是 csv 格式的代码(我不显示字段 ServerSideEncryption 和 SSEKMSKeyId 但我在实际代码中使用它们):
csv_to_write = df.to_csv(None).encode()
s3_client.put_object(Bucket=bucket_name,Key='data.csv', Body=csv_to_write,
ServerSideEncryption='XXXXX', SSEKMSKeyId='XXXXXXXX')
Run Code Online (Sandbox Code Playgroud)
有人有镶木地板的等价物吗?谢谢