我有大约 100 个本地 parquet 文件,必须将它们作为单个表加载到 bigquery。 所有文件都位于一个目录中并且具有相同的架构。 我尝试过以下方法
#in python
import pyarrow.dataset as ds
import pyarrow.parquet as pq
input_dir = '/dir/with/parquet/files'
dataset = ds.dataset(input_dir, format="parquet")
pq.write_table(dataset.to_table(), "big_file.pqt")
这里的问题是文件总数约为 300gig,我们的内存不足。 如果这可以分块完成也许可以,但我不知道这是否可能
#in command line
bq load --source_format=PARQUET my-project:mydataset.biqfile \
"/dir/with/parquet/files/*.pqt"
这会引发异常。 我尝试了上述几种不同的风格,例如a)从最后一行删除引号和b)将最后一行更改为
/dir/with/parquet/files/\*.pqt
。 所有人都抛出了异常。 我是脚本编写的初学者,所以也许这里缺少一些明显的东西。
我编写了一个脚本,将每个文件按顺序加载到所需的表中。 这是代码:
import os
import subprocess
import argparse
import sys
project = 'my-project'
dataset = 'my_dataset'
table = 'my-table'
#create an empty table
create_table_cmd = f'bq mk --table {project}:{dataset}.{table}'
print(f"Creating table: {create_table_cmd}")
subprocess.run(create_table_cmd, shell=True, check=True)
# Load data into the table
for file in os.listdir(parquet_dir):
if file.endswith(('.parquet', '.pqt')):
file_path = os.path.join(parquet_dir, file)
load_cmd = f'bq load --source_format=PARQUET --autodetect {dataset}.{table} "{file_path}"'
print(f"Loading file: {load_cmd}")
subprocess.run(load_cmd, shell=True, check=True)