提问者:小点点

Apache Beam可以检测Parquet文件(如Spark和Pandas)的架构(列名)吗?


我是Apache Beam的新手,我来自API丰富的Spark世界。

如何使用Apache Beam获取Parquet文件的模式?没有它,我在内存中加载数据,因为有时它的风险很大,我只对了解列感兴趣,并且可选地了解列类型。

语言Python。

存储系统是Google Cloud Storage,Apache Beam作业必须在Dataflow中运行。

FYI,我尝试了sof中建议的以下方法:

from pyarrow.parquet import ParquetFile
ParquetFile(source).metadata

首先,当我给它一个gs://…路径时,它不起作用,给我这个错误:错误:没有这样的文件或目录

然后我尝试在我的机器中使用本地文件,并将代码稍微更改为:

from pyarrow.parquet import ParquetFile
ParquetFile(source).metadata.schema

所以我可以有专栏:

<pyarrow._parquet.ParquetSchema object at 0x10927cfd0>
name: BYTE_ARRAY
age: INT64
hobbies: BYTE_ARRAY String

但是这个解决方案在我看来需要我将这个文件获取到本地(Dataflow服务器??)并且它不使用Apache Beam。

有什么(更好的)解决方案吗?

谢谢你!


共1个答案

匿名用户

我很高兴在阅读了apache_beam.io. parquetio的代码源代码后,我可以想出一个手工制作的解决方案:

import pyarrow.parquet as pq
from apache_beam.io.parquetio import _ParquetSource
import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '<json_key_path>'

ps = _ParquetSource("", None, None, None) # file_pattern, min_bundle_size, validate, columns
with ps.open_file("<GCS_path_of_parquet_file>") as f:
    pf = pq.ParquetFile(f)
    print(pf.metadata.schema)