使用 hdfs 外部表进行数据加载有三个步骤。
• 把需要加载的数据文件放到 hdfs 数据目录
• 定义外部表
• 加载数据
例如我们在 Hadoop HDFS 中创建一个目录‘/expense’,并在本地文件系统中准备好待导入的 CSV 格式数据文件‘expense.data’:
john|2017-01-20|100.00|travel|nothing
tom|2016-12-01|300|taxi|nothing
marry|2017-01-21|1000.00|travel|nothing
kurt|2016-12-02|800|taxi|nothing
然后用 Hadoop HDFS 文件系统命令上传数据文件,假设待上传文件为当前文件夹下:
hdfs dfs-put ./expense.data /expense
2、定义外部表
可以使用下面的命令创建外部表,其中‘nnhost’和‘nnport’代表使用的 Hadoop HDFS的 namenode 主机地址和端口号:
CREATE EXTERNAL TABLE ext_expenses
( name text, date date, amount float4, category text, desc1 text )
LOCATION ('hdfs://nnhost:nnport/expense')
FORMAT 'csv' (DELIMITER '|');
可以直接查询该外部表:
etl=# select * from ext_expenses;
name | date | amount | category |desc1
------+------------+--------+----------+--------
john | 2017-01-20 | 100 | travel | nothing
tom | 2016-12-01 | 300 | taxi | nothing
marry | 2017-01-21 | 1000 | travel | nothin
kurt | 2016-12-02 | 800 | taxi | nothing
CREATE EXTERNAL TABLE ext_expenses ( name text, date date, amount float4,category text, desc1 text )
LOCATION ('hdfs://nnhost:nnport/expense')
FORMAT 'csv' (DELIMITER '|')
LOG ERRORS INTO expense_errortable SEGMENT REJECT LIMIT 10 ROWS;
上面那条语句指定了 error table为 expense_errortable,系统会自动创建该表,该表为外部表。SEGMENT REJECT LIMIT 指的是如果有超过 10 行的错误,加载将报错退出。
如果一个 CSV 文件包含错误的格式,error table 的 rawdata 列可能包含几个合并的错误行。例如,如果一个 text 列的值少了一个结束的引号,后面的行(包含换行符)将会被当作那个列的值处理。当这种情况发生时,并且该值超过 64K 大小时,WuTongDB会把64K 大小的值放入 error table 中做为一个单独的行,继续处理后面的行。如果这种情况发生多次,加载会失败,WuTongDB会报“rejected N or more rows”错退出。
3、加载数据
下面这条语句可以很简单的加载 ext_expenses 表中的数据到expenses表中。
CREATE TABLE expenses AS SELECT * FROM ext_expenses;
用户也可以通过把建表语句以及加载数据分开:
CREATE TABLE expenses(name text, date date, amount float4, category text,desc1 text);
INSERT INTO expenses SELECT * FROM ext_expenses;
根据读取数据文件本身的规模,WuTongDB会根据用户配置自动调整数据读取的并行度,实现动态并行的数据加载。




