Greenplum数据库版本: PostgreSQL 8.2.15(Greenplum Database 4.2.3.0 build 1)
SQL Server数据库版本: Microsoft SQL Server 2008 R2(SP1)
我们目前的做法:
1)将每个表导出到SQL Server的平面文件中
2)使用PSQL Console的psql.exe实用程序将数据加载到带有pgAdmin III的Greenplum中
...带来了好处
速度:好的,但有什么更快的吗?我们在几分钟内加载数百万行数据
自动化:好的,我们使用VB中的Shell脚本从SSIS包中调用此实用程序
...陷阱
可靠性:ETL依赖于文件服务器来保存平面文件
安全性:文件服务器上有很多可能敏感的数据
错误处理:这是一个问题。 psql.exe永远不会引发我们可以捕获的错误,即使它出错并且没有加载任何数据或部分文件
我们还尝试了什么......
.Net Providers \ Odbc Data Provider:我们使用DataDirect 6.0 Greenplum Wire Protocol配置了系统DSN。 DELETE的良好性能。 INSERT的狗很慢
作为参考,这是上面提到的SSIS中的VB脚本......
Public Sub Main()
Dim v_shell
Dim v_psql As String
v_psql = "C:\Program Files\pgAdmin III\1.10\psql.exe -d "MyGPDatabase" -h "MyGPHost" -p "5432" -U "MyServiceAccount" -f \\MyFileLocation\SSIS_load\sql_files\load_MyTable.sql"
v_shell = Shell(v_psql, AppWinStyle.NormalFocus, True)
End Sub
这是“load_MyTable.sql”文件的内容......
\copy MyTable from '\\MyFileLocation\SSIS_load\txt_files\MyTable.txt' with delimiter as ';' csv header quote as '"'
答案 0 :(得分:1)
如果您在几分钟内完成数据加载,那么当前的方法可能就足够了。但是,如果您发现自己必须加载更大量的数据(例如太字节),那么批量加载到Greenplum的常用首选方法是通过gpfdist
和相应的EXTERNAL TABLE
定义。 gpload
是一个不错的包装器,它提供了对这个过程的大部分抽象,并且由YAML控制文件驱动。一般的想法是gpfdist
实例在您的数据被暂存的位置旋转,最好是CSV文本文件,然后Greenplum中的EXTERNAL TABLE
定义被告知gpfdist
个实例的URI。在管理指南中,此类外部表的示例定义如下所示:
CREATE READABLE EXTERNAL TABLE students (
name varchar(20), address varchar(30), age int)
LOCATION ('gpfdist://<host>:<portNum>/file/path/')
FORMAT 'CUSTOM' (formatter=fixedwidth_in,
name=20, address=30, age=4,
preserve_blanks='on',null='NULL');
上面的示例希望读取其字段从左到右是20个字符(最多)字符串,30个字符的字符串和整数的文本文件。要将此数据实际加载到GP中的临时表中:
CREATE TABLE staging_table AS SELECT * FROM students;
对于大量数据,这应该是最有效的方法,因为所有段主机都参与并行加载。请记住,上面简化的方法可能会导致随机分布的表,这可能是不可取的。您必须自定义表定义以指定分发键。