示例sql:
CREATE FOREIGN TABLE lxdb_test (
i1 int,
i2 int,
txt1 text OPTIONS(token 'ik'),
txt2 text
) SERVER lxdb OPTIONS(store 'ids');
13.1. 常规导入-insert语句
- 单条数据导入
INSERT INTO lxdb_test(i1, i2, txt1,txt2) VALUES (0, 100, 'txt myn 我爱你中国 ', 'txt2');
- 多条数据批量导入(性能较高)
INSERT INTO lxdb_test(i1, i2, txt1,txt2) VALUES
(0, 100, 'txt11', 'txt21'),
(1, 101, 'txt12', 'txt22'),
(1, 102, 'txt12', 'txt22');
注意事项:
建议拼装的时候考虑数据的大小,判断下SQL的长度.如可以配置一次性导入10240条或sql长度超过1M.
13.2. 通过copy命令导入
- 基本使用
支持通过copy命令,将文件中的数据导入
copy lxdb_key_val from '/home/lxdb/myn/a.txt' with DELIMITER E','
注意事项:如果copy的某一行有异常,copy会退出,如果是无更新模式,所有记录会被回退,如果是更新模式,则部分正常的记录会被更新掉
- 借助xargs与copy的stdin方法将一个目录中的文件都导入进去(串行导入)
find /home/lxdb/demo -type f -name "*.txt" |xargs cat|psql -c "copy lxdb_test_cluster from stdin with DELIMITER E','"
- 借助xargs 实现多个文件,多进程并行导入
find /home/lxdb/demo -type f -name "*.txt" | xargs -P 8 -i bash -c "cat {} |psql -c \"copy hash
test(i1,i2,txt1,txt2) from stdin with DELIMITER E','\""
- 借助awk在导入前,对数据进行部分拼接处理
find /home/lxdb/demo -type f -name "*.txt" | xargs -P 8 -i bash -c "cat {}|awk ' BEGIN {r=rand()*10000}{printf \"%d%d,%s\\n\" ,(NR/1024),r,\$0}' |psql -c \"copy hash
test(hashstr,i1,i2,txt1,txt2) from stdin with DELIMITER E','\""
- 如果觉得在awk里拼脚本,需要转移太麻烦,可以通过xargs调用shell,在具体的shell里进行相关拼接处理,也是一个好办法,即降低了脚本编写难度,也简化了并行处理
第一步,通过xargs调用shell
第二步,在shell里,执行copy
示例一,执行SQL
eval " echo \"ALTER FOREIGN TABLE ${table_name} add ${j} text \"|/opt/software/lxdb/pg/bin/psql -h ${cn_addr} -p 5432 lxdb lxdb "
示例二,执行copy
eval "cat '${csv_list}'|awk '{if (NR==1) {printf \"\\\"hashfield\\\",%s\n\",\$0} else {printf \"\\\"%d\\\",%s\n\",(NR),\$0}}' |/opt/software/lxdb/pg/bin/psql -h 127.0.0.1 -p 5432 lxdb lxdb -c \"COPY ${table_name}(hashfield,${arry_list4_str}) FROM stdin with DELIMITER ',' csv header quote '\\\"' encoding 'UTF8';\" "