未分类

在windows下使用postgreSQL导入tpch的数据表

初学数据库,老师要求我们去熟悉postgreSQL,并且要求使用tpch的数据。今天在使用dbgen生成数据以及导入数据到postgre的过程中遇到一些问题,也在网上看了许多资料,几番折腾之后最终也算解决了问题,现在来把今天使用dbgen的流程和遇到的问题以及解决方案总结一下,以便以后需要的时候不用再到处找资料。

使用visual studio打开dbgen文件夹下的tpch.sln并生成,生成之后会有一个Debug文件夹下,把该文件夹下的dbgen.exe复制到dbgen文件夹下,运行dbgen.exe生成后缀名为.tbl的文件。

文件夹

在postgre创建数据库tpch,连接到数据库tpch之后创建表,表的定义可以查看dbgen目录下的dss.ddl。

dss.ddl

使用copy操作来从文件导入数据,这里以生成的.tbl文件里面的lineitem.tbl为例进行说明。

具体操作为,COPY LINEITEM FROM '<path>'<path>为lineitem.tbl所在的位置,具体参考下图。我一开始是放在桌面下,直接运行指令之后报错了,提示permission denied,原来是postgre对桌面目录没有访问权限,于是试着用管理员身份运行SQL shell,还是不行。最后直接把lineitem.tbl复制到postgre的安装目录下了,一举搞定,导入完数据记得再删除这些文件即可。再次运行copy操作,还是报错,这次提示的错误是‘无效的整型输入语法’,一脸懵逼,网上几番查找之后才发现原来是引文分隔符的问题,postgre在copy时默认字段的分隔符是'\t',而dbgen生成的数据里面是用'|'字符来分开字段,于是造成字段没能正确区分开。解决方案就是在copy的时候加上参数delimiter指定分隔符号为'|',具体写法为:COPY LINEITEM FROM '<path>' WITH DELIMITER AS '|'; 再次尝试了一下,这个错误解决了,但却出现了另一个错误,提示‘最后期望字段后有额外数据’,真是贼坑,怎么还有额外数据呢?

错误信息

最后打开lineitem.tbl文件一观文件内容,发现每一行记录的结尾都带有'|'字符,心想会不会是因为这个的影响导致copy按照字段分隔理解为'|'后面还有其他字段。网上查了查也没有查到什么解决方法,倒是看到一篇博客让我恍然大悟。博客链接如下http://www.xuebuyuan.com/845077.html,里面也是讲到导入数据出错的问题,他用的是ms sql server,解决方案是导入数据时加参数rowterminator=‘|\n’,看到他的解决方案,我就大概明白是怎么一回事了。

lineitem.tbl

查阅postgre的文档,却没有发现copy操作有什么指定每一行结束的字符的参数,于是通过加参数的方式看来是行不通了。只能修改tbl文件了。简单写了个c++程序(c++11),把生成的lineitem.tbl文件里面文本每一行的结尾的'|'字符去掉。最后运行完之后,再次尝试copy,这次终于顺利copy了,把文件中的数据导入到数据库,这也恰好证实了之前的猜测是对的,果然是因为结尾的'|'字符的影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

int main() {
freopen("lineitem.tbl", "r", stdin);
freopen("tbl/lineitem.tbl", "w", stdout);

string line;

while (getline(cin, line)) {
line.pop_back();
cout << line << endl;
}

return 0;
}

结果

虽然都只是小问题,不过还是折腾了许久,还好最后解决了还算有所收获。今晚跟同学交流时发现他在linux下也遇到这些问题,把今天的解决方法跟他交流之后也顺利解决了。现在,基本流程和解决方法描述完毕,以上描述应该是可以适用windows和linux系统,其他系统应该也类似。第一次写博客,写得比较粗糙。若有错误或者可以改进的地方还请大神指点。

分享到