Closed sakaik closed 1 month ago
なるほど、『一件もデータが存在しなかった』はシングルプロセスの場合にはエラーで良い(空のApache Arrowファイルが生成される)ですが、並列モードだと 0 件を他のスレッドとマージするという操作が必要になりそうですね。
9389fb758eab82af905543fe7a37097d6e55ca62
で修正を入れてみましたが、いかがでしょう?
本質的にはワーカーの一個で empty results になっただけのものを、全体のエラーとして扱った事が原因のようです。
9389fb
の pg2arrow で現象が発生しなくなることを確認しました。
概要
pg2arrow が パラレルモードの引数 n の値を大きくしたときにエラーになりました。(今回のケースでは n=5はOK、n=6以上でエラー)
問題なくarrowファイルが出力されたコマンド例
エラーとなったコマンドとそのエラー内容
再現方法
データ生成用スクリプト
データ生成のために以下のPythonスクリプトを作成します
def make_random_str(len): return ''.join(random.choices(string.ascii_letters + string.digits, k=len))
def main(id):
rows = 33554432
if name == "main": if len(sys.argv)>1: id = sys.argv[1].zfill(5) else: id = "99999" main(id)
DB_NAME=sakaitest_nvme5 echo "CREATE TABLE mytmp (id char(5), no integer, x varchar(20), y varchar(20), z varchar(20), a varchar(20), b varchar(20));" | psql -Upostgres -d ${DB_NAME} python3 makeArrowTestData.py 1 | psql -Upostgres -d ${DB_NAME} -c "\COPY mytmp FROM STDIN"
pg2arrow -u postgres -d ${DB_NAME} -t mytmp -n12 -o ./test.arrow
pgsql_client.c:1063 SQL query has empty results: SELECT FROM mytmp WHERE ctid >= '(229376,0)'::tid AND ctid < '(262144,0)'::tid pgsql_client.c:1063 SQL query has empty results: SELECT FROM mytmp WHERE ctid >= '(262144,0)'::tid AND ctid < '(294912,0)'::tid