Google cloud storage ApacheBeam能否检测到Spark和Pandas等拼花地板文件的模式(列名)?

Google cloud storage ApacheBeam能否检测到Spark和Pandas等拼花地板文件的模式(列名)?,google-cloud-storage,google-cloud-dataflow,apache-beam,parquet,apache-beam-io,Google Cloud Storage,Google Cloud Dataflow,Apache Beam,Parquet,Apache Beam Io,我是Apache Beam的新手,我来自Spark world,那里的API非常丰富 如何使用Apache Beam获取拼花地板文件的模式?否则,我会将数据加载到内存中,因为有时数据可能会非常庞大,我感兴趣的只是知道列以及可选的列类型 语言是Python 存储系统是Google云存储,Apache Beam作业必须在数据流中运行 仅供参考,我已尝试了以下建议: 首先,当我给它一个gs://..路径时,它不工作,给我这个错误:错误:没有这样的文件或目录 然后,我尝试在我的机器中创建一个本地文件,并

我是Apache Beam的新手,我来自Spark world,那里的API非常丰富

如何使用Apache Beam获取拼花地板文件的模式?否则,我会将数据加载到内存中,因为有时数据可能会非常庞大,我感兴趣的只是知道列以及可选的列类型

语言是Python

存储系统是Google云存储,Apache Beam作业必须在数据流中运行

仅供参考,我已尝试了以下建议:

首先,当我给它一个
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

名称:字节数组
年龄:INT64
爱好:字节数组字符串
但在我看来,这个解决方案要求我将这个文件放到本地(数据流服务器的),并且它不使用ApacheBeam

有(更好的)解决方案吗


谢谢大家!

我很高兴在阅读了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)
导入pyarrow.parquet作为pq
来自apache_beam.io.parquetio import_ParquetSource
导入操作系统
os.environ['GOOGLE\u应用程序\u凭据']=''
ps=_ParquetSource(“”,None,None,None)#文件模式,最小捆绑大小,验证,列
使用ps.open_文件(“”)作为f:
pf=pq.镶木地板(f)
打印(pf.metadata.schema)

我很高兴在阅读了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)
导入pyarrow.parquet作为pq
来自apache_beam.io.parquetio import_ParquetSource
导入操作系统
os.environ['GOOGLE\u应用程序\u凭据']=''
ps=_ParquetSource(“”,None,None,None)#文件模式,最小捆绑大小,验证,列
使用ps.open_文件(“”)作为f:
pf=pq.镶木地板(f)
打印(pf.metadata.schema)

那么,您可以使用具有相同路径的gsutil来证明文件存在吗?是的,运行“gsutil ls”可以证明文件存在。此外,在Python脚本中,如果我使用beam.io.ReadFromParquet(路径、列)进行测试,则文件读取成功。谢谢,很好。请随意回答下面你自己的问题,但这不是我需要的。ReadFromParquet(或ptTransform?)方法读取文件的内容,并将列名数组作为参数进行选择。因此,列名不在返回中。我需要返回包含所有现有列名的模式。谢谢。就我个人而言,我只需要使用GCS python sdk,下载文件,然后使用那些pyarrow函数。我不知道为什么您真的需要Beam中的模式,而它更倾向于读取整个文件以进行处理。那么,您可以使用具有相同路径的gsutil来证明该文件存在吗?是的,运行“gsutil ls”该文件存在。此外,在Python脚本中,如果我使用beam.io.ReadFromParquet(路径、列)进行测试,则文件读取成功。谢谢,很好。请随意回答下面你自己的问题,但这不是我需要的。ReadFromParquet(或ptTransform?)方法读取文件的内容,并将列名数组作为参数进行选择。因此,列名不在返回中。我需要返回包含所有现有列名的模式。谢谢。就我个人而言,我只需要使用GCS python sdk,下载文件,然后使用那些pyarrow函数。我不知道为什么您真的需要Beam中的模式,而它更倾向于读取整个文件进行处理