如何将GCS中Parquet文件的分区列同步至BigQuery表
我在Google Cloud Storage(GCS)存储桶中存储了Parquet文件,路径示例为:gs://some_storage/files.parquet/category=abc/type=xyz/partition.parquet
每个Parquet文件包含字段:{'date':'2023-03-01','value': 2.718}
我需要将这些字段加载至BigQuery,且最终表中需包含category和type分区列,即数据字段为:{'date':'2023-03-01','value': 2.718, 'category': 'abc', 'type': 'xyz'}
目前我通过遍历目录gs://some_storage/files.parquet,用正则从路径中提取分区值,读取Parquet文件时追加列后导入BigQuery,代码如下:
import re import gcsfs import pyarrow.parquet as pq fs = gcsfs.GCSFileSystem(project='gcs-project') # extract paths paths = [] root_dir = 'gs://some_storage/files.parquet' category_paths = fs.ls(root=root_dir) for category_path in category_paths: feature_paths = fs.ls(category_path) for file_path in feature_paths: [file_paths] = fs.ls(file_path) paths.append(file_paths) # read and append partition columns for path in paths: category = re.search(r'category=(.*?)/', path).group(1) feature = re.search(r'feature=(.*?)/', path).group(1) df = pq.ParquetDataset(path) # append the category and feature on the df df['category'] = category df['feature'] = feature # finally insert to bigquery
这种分区格式是Parquet的标准形式,请问是否有通过PyArrow或谷歌云服务直接读取分区列的方法,无需遍历路径和正则提取?或者有没有更优方式让BigQuery表自动包含category和type列?
一、PyArrow自动识别Hive风格分区
你的路径属于Hive风格分区(key=value格式),PyArrow的ParquetDataset可以自动解析这类分区列,完全替代手动遍历和正则提取的步骤:
import pyarrow.parquet as pq import gcsfs fs = gcsfs.GCSFileSystem(project='gcs-project') root_dir = 'gs://some_storage/files.parquet' # 直接读取根目录,PyArrow会自动扫描所有子目录的分区键值 dataset = pq.ParquetDataset(root_dir, filesystem=fs) table = dataset.read() # 转换为DataFrame(按需操作) df = table.to_pandas() # 此时df已包含date、value、category、type所有列,可直接导入BigQuery
原理:PyArrow会自动识别路径中的key=value结构,将键作为列名、对应值作为列数据添加到结果集中,无需手动处理。
二、BigQuery直接加载(无需本地处理)
BigQuery原生支持识别GCS上的Hive风格分区Parquet文件,直接加载即可自动生成分区列,效率更高:
方法1:控制台操作
- 进入BigQuery控制台,选择目标数据集,点击「创建表」
- 数据源选「Google Cloud Storage」,输入路径
gs://some_storage/files.parquet/**(**表示递归扫描所有子目录) - 文件格式选择「Parquet」
- 高级选项中无需手动设置分区,BigQuery会自动识别路径中的
category和type作为列 - 点击「创建表」,完成后表中会自动包含所有目标字段
方法2:bq命令行工具
bq load \ --source_format=PARQUET \ --hive_partitioning_mode=AUTO \ your-project.your-dataset.your-table \ gs://some_storage/files.parquet/**
参数--hive_partitioning_mode=AUTO会让BigQuery自动检测并解析Hive风格分区路径,将分区键作为列导入表中。
内容的提问来源于stack exchange,提问作者Mike G

