我查看了标准文档,我期望找到符合我需求的内容(Apache Arrow和Pandas),但似乎无法解决问题。
我最熟悉Python,因此希望使用Python,但这不是必须的要求。
问题
我需要将 Parquet 文件从一个位置(URL)移动到另一个位置(Azure 存储帐户,在此情况下使用 Azure 机器学习平台,但这与我的问题无关)。
由于这些文件太大,不能仅仅执行 pd.read_parquet("https://my-file-location.parquet")
,因为这会将整个文件读取到对象中。
期望
我认为应该有一种简单的方法来创建一个文件对象,并按行流式传输该对象 - 或者可能是按列块进行传输。就像这样:
import pyarrow.parquet as pq
with pq.open("https://my-file-location.parquet") as read_file_handle:
with pq.open("https://my-azure-storage-account/my-file.parquet", "write") as write_filehandle:
for next_line in read_file_handle{
write_file_handle.append(next_line)
我知道这会与主要用于以列方式访问Parquet的方式略有不同。也许有一种配置对象,我需要传递它来指定感兴趣的列,或者可以在一个块中获取多少行或类似的内容。
但是关键的期望是:有一种方法可以访问Parquet文件而无需将其全部加载到内存中。我该如何做到这一点?
顺便说一下,我尝试过只使用Python标准的open
函数,但我不确定如何在URL位置和字节流中使用open
。如果可能仅通过open
跳过任何特定于Parquet的内容来完成此操作,那也可以。
更新
一些评论建议使用类似于bash的脚本,例如这里。如果没有其他选择,我可以使用这个方法,但这并不理想,因为:
- 我更喜欢将所有内容都保留在完整的语言SDK中,无论是Python、Go还是任何其他语言。如果解决方案转移到具有管道的bash脚本中,由于最终解决方案不会完全编写bash、Powershell或任何脚本语言,因此需要进行外部调用。
- 我真的想利用Parquet本身的一些优点。如我在下面的评论中所述,Parquet是列存储。因此,如果我有一个包含11亿行和100列的“数据框”,但我只关心3列,则希望能够仅下载这3列,从而节省大量时间和一些金钱。