将大数据导出到 CSV 文件
Exporting big data to CSV files
我当前的任务要求我从一个非常大的数据库中导出大约 100,000 行数据。
我对处理大数据还很陌生,我很想听听那些有过这些问题经验的人的一些最佳实践和指导方针过去曾为他们工作,努力使这个post非主观。
更多细节:
数据库根本没有规范化(非常难看)
我总共要处理至少 100,000 行
任务是运行午夜,用户较少
目前使用 ColdFusion 9、PostgreSQL 8.4
谢谢!
这是应用 Craig 的解决方案后我的代码的样子:
<cfset base_path = GetDirectoryFromPath(ExpandPath("*.*")) & "some_parent\some_child\">
<cfif not DirectoryExists(base_path)>
<cfdirectory directory="#base_path#" action="create" mode="777">
</cfif>
<cfset this_batch_path = DateFormat(Now(), 'mmddyyyy') & TimeFormat(Now(), 'hhmmss') & "\">
<cfdirectory directory="#base_path##this_batch_path#" action="create" mode="777">
<cfset this_filename = "someprefix_" & DateFormat(Now(), 'yyyymmdd') & ".csv">
<cffile action="write" file="#base_path##this_batch_path##this_filename#" output="">
<cfset escaped_copy_path = ListChangeDelims(base_path & this_batch_path & this_filename, "\", "\")>
<cfquery name="qMyQuery" datasource="some_db" username="some_uname" password="some_pword" result="something">
COPY some_table TO '#escaped_copy_path#' WITH CSV HEADER;
</cfquery>
现在我需要获取复制的行数。
在 PGSQL 8.4 文档中:
Outputs
On successful completion, a COPY command returns a command tag of the
form
COPY count
The count is the number of rows copied.
但我似乎无法让它工作,即使使用结果标记和查询本身也是如此。
100,000 行并不大,除非这些行非常非常宽且值很大。
只需使用 psql
和 \copy (SELECT ...) TO '/some/local/file' WITH (FORMAT CSV, HEADER)
如果需要,可以估算数据大小:
select pg_size_pretty(sum( octet_length(t::text) )) FROM mytable t WHERE ...;
对于实际的大数据提取运行,有时您可能希望使用 Talend Studio、Pentaho Kettle 或 CloverETL 等 ETL 工具。
顺便说一句,是时候开始考虑从 8.4 升级了,因为它现在已经停产了。
我当前的任务要求我从一个非常大的数据库中导出大约 100,000 行数据。
我对处理大数据还很陌生,我很想听听那些有过这些问题经验的人的一些最佳实践和指导方针过去曾为他们工作,努力使这个post非主观。
更多细节:
数据库根本没有规范化(非常难看)
我总共要处理至少 100,000 行
任务是运行午夜,用户较少
目前使用 ColdFusion 9、PostgreSQL 8.4
谢谢!
这是应用 Craig 的解决方案后我的代码的样子:
<cfset base_path = GetDirectoryFromPath(ExpandPath("*.*")) & "some_parent\some_child\">
<cfif not DirectoryExists(base_path)>
<cfdirectory directory="#base_path#" action="create" mode="777">
</cfif>
<cfset this_batch_path = DateFormat(Now(), 'mmddyyyy') & TimeFormat(Now(), 'hhmmss') & "\">
<cfdirectory directory="#base_path##this_batch_path#" action="create" mode="777">
<cfset this_filename = "someprefix_" & DateFormat(Now(), 'yyyymmdd') & ".csv">
<cffile action="write" file="#base_path##this_batch_path##this_filename#" output="">
<cfset escaped_copy_path = ListChangeDelims(base_path & this_batch_path & this_filename, "\", "\")>
<cfquery name="qMyQuery" datasource="some_db" username="some_uname" password="some_pword" result="something">
COPY some_table TO '#escaped_copy_path#' WITH CSV HEADER;
</cfquery>
现在我需要获取复制的行数。 在 PGSQL 8.4 文档中:
Outputs
On successful completion, a COPY command returns a command tag of the form
COPY count
The count is the number of rows copied.
但我似乎无法让它工作,即使使用结果标记和查询本身也是如此。
100,000 行并不大,除非这些行非常非常宽且值很大。
只需使用 psql
和 \copy (SELECT ...) TO '/some/local/file' WITH (FORMAT CSV, HEADER)
如果需要,可以估算数据大小:
select pg_size_pretty(sum( octet_length(t::text) )) FROM mytable t WHERE ...;
对于实际的大数据提取运行,有时您可能希望使用 Talend Studio、Pentaho Kettle 或 CloverETL 等 ETL 工具。
顺便说一句,是时候开始考虑从 8.4 升级了,因为它现在已经停产了。