使用COPY命令导入导出数据 --------------------------- COPY命令可以用来导入和导出数据,COPY命令既可以通过HDFS的URL也可以通过本地文件进行数据的导入和导出。 COPY在导入导出本地文件时,是在master节点的串行操作,只适合少量数据的导入和导出。 COPY在导入导出HDFS的文件时,是在segment上的并行操作,可以用来支持大量数据的导入和导出 下面章节给出一些简单的例子说明如何使用COPY来导入和导出数据。关于NULL值处理,分割符,换行符,转义字符以及编码的处理可以参考格式化输入和输出文件章节。 * 使用COPY导入本地数据 * 使用COPY导出数据到本地 * 使用COPY导入HDFS数据文件 * 使用COPY导出数据到HDFS目录 * 使用Error table 使用COPY导入本地数据 +++++++++++++++++++++ 使用COPY可以从文件或者标准控制台导入数据到一个表中。 .. code-block:: html :linenos: # 下面的命令把文件/data1/load-files/expenses.out中的内容导入到myexpenses表中 COPY myexpenses FROM '/data1/load-files/expense_m.out' # 下面的命令把STDIN中的数据导入到myexpenses表 etl=# COPY myexpenses FROM STDIN; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> john 2017-01-20 100 travel nothing >> \. 使用COPY导出数据到本地 ++++++++++++++++++++++++++ COPY命令可以导出一个表到一个文件中或者标准输出控制台中。例如: .. code-block:: html :linenos: # 下面命令拷贝一个表的部分数据到一个文件中 COPY (SELECT * FROM myexpenses WHERE name LIKE 'm%') TO '/data1/load-files/expense_m.out'; # 下面命令拷贝一个表的所有数据到一个文件中 COPY myexpenses TO '/data1/load-files/expense_m.out'; # 下面命令拷贝一个表到控制台 COPY myexpenses TO STDOUT; 使用COPY导入HDFS上的数据文件 ++++++++++++++++++++++++++++++++++++ 使用COPY可以从HDFS的数据文件或者目录导入数据到一个表中。 .. code-block:: html :linenos: # 下面的命令把HDFS上的文件hdfs://oushudb/data1/load-files/expenses.out中的内容导入到myexpenses表中 COPY myexpenses FROM 'hdfs://oushudb/data1/load-files/expense_m.out' # 下面的命令把整个HDFS上的目录中的所有文件hdfs://oushudb/data1/load-files/中的所有文件内容导入到myexpenses表中 COPY myexpenses FROM 'hdfs://oushudb/data1/load-files' # 下面的命令通过“*”通配符把HDFS上的目录中的多个文件hdfs://oushudb/data1/load-files/e*.out中的所有文件内容导入到myexpenses表中 COPY myexpenses FROM 'hdfs://oushudb/data1/load-files/e*.out' # COPY可以支持将HDFS上的ORC文件直接导入表中,下面的命令将hdfs://oushudb/data1/load-files/orc_files下的ORC格式文件导入到myexpenses表中 COPY myexpenses FROM 'hdfs://oushudb/data1/load-files/orc_files' ORC 使用COPY导出数据到HDFS数据目录 +++++++++++++++++++++++++++++++++++++++++ COPY命令可以导出一个表到一个文件中或者标准输出控制台中。例如: .. code-block:: html :linenos: # 下面命令拷贝一个表的部分数据到一个HDFS文件目录中 COPY (SELECT * FROM myexpenses WHERE name LIKE 'm%') TO 'hdfs://oushudb/data1/load-files'; # 下面命令拷贝一个表的所有数据到一个HDFS文件目录中 COPY myexpenses TO 'hdfs://oushudb/data1/load-files/'; # 下面命令以ORC格式拷贝一个表的部分数据到一个HDFS文件目录中 COPY (SELECT * FROM myexpenses WHERE name LIKE 'm%') TO 'hdfs://oushudb/data1/load-files' ORC; # 下面命令以ORC格式拷贝一个表的所有数据到一个HDFS文件目录中 COPY myexpenses TO 'hdfs://oushudb/data1/load-files/orc_files' ORC 使用Error table +++++++++++++++++++++++ COPY命令在导入本地数据也可以使用error table来隔离出错的行。 .. code-block:: html :linenos: COPY myexpenses FROM '/data1/load-files/expense1' WITH DELIMITER '|' LOG ERRORS INTO exp_errtable SEGMENT REJECT LIMIT 10 ROWS; COPY命令在导入HDFS数据也可以使用error table来隔离出错的行。 .. code-block:: html :linenos: COPY myexpenses FROM 'hdfs://oushudb/data1/load-files/expense1' WITH DELIMITER '|' LOG ERRORS INTO exp_errtable SEGMENT REJECT LIMIT 10 ROWS;