将多个本地 parquet 文件上传到 bq

问题描述 投票:0回答:1

我有大约 100 个本地 parquet 文件,必须将它们作为单个表加载到 bigquery。 所有文件都位于一个目录中并且具有相同的架构。 我尝试过以下方法

  1. 本地合并然后上传到bq
#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,我们的内存不足。 如果这可以分块完成也许可以,但我不知道这是否可能

  1. 使用命令行工具将所有目录加载为单个文件
#in command line
bq load --source_format=PARQUET my-project:mydataset.biqfile \
 "/dir/with/parquet/files/*.pqt"

这会引发异常。 我尝试了上述几种不同的风格,例如a)从最后一行删除引号和b)将最后一行更改为

/dir/with/parquet/files/\*.pqt
。 所有人都抛出了异常。 我是脚本编写的初学者,所以也许这里缺少一些明显的东西。

google-bigquery pyarrow
1个回答
0
投票

我编写了一个脚本,将每个文件按顺序加载到所需的表中。 这是代码:

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)

© www.soinside.com 2019 - 2024. All rights reserved.