Impala 从本地文件加载CSV数据


本教程适合第一次尝试Impala SQL特性的用户。

TAB1TAB2从HDFS中的文件加载数据。数据的子集从复制TAB1TAB3

使用您要查询的数据填充HDFS。

要开始此过程,请在HDFS中的用户目录下创建一个或多个新子目录。每个表的数据驻留在单独的子目录中。username在适当的地方替换您自己的用户名。

本示例使用-p选项和mkdir操作来创建任何必要的父目录。

$ whoami
username
$ hdfs dfs -ls /user
Found 3 items
drwxr-xr-x   - username username            0 2013-04-22 18:54 /user/username
drwxrwx---   - mapred   mapred              0 2013-03-15 20:11 /user/history
drwxr-xr-x   - hue      supergroup          0 2013-03-15 20:10 /user/hive
$ hdfs dfs -mkdir -p /user/username/sample_data/tab1 /user/username/sample_data/tab2

这是一些示例数据,用于两个名为TAB1和的表TAB2

将以下内容复制到.csv本地文件系统中的文件:

tab1.csv:

1,true,123.123,2012-10-24 08:55:00
2,false,1243.5,2012-10-25 13:40:00
3,false,24453.325,2008-08-22 09:33:21.123
4,false,243423.325,2007-05-12 22:32:21.33454
5,true,243.325,1953-04-22 09:11:33

tab2.csv:

1,true,12789.123
2,false,1243.5
3,false,24453.325
4,false,2423.3254
5,true,243.325
60,false,243565423.325
70,true,243.325
80,false,243423.325
90,true,243.325

.csv使用如下命令将每个文件放入单独的HDFS目录中,这些命令使用ImpalaDemoVM中可用的路径:

$ hdfs dfs -put tab1.csv /user/username/sample_data/tab1
$ hdfs dfs -ls /user/username/sample_data/tab1
Found 1 items
-rw-r--r--   1 username username        192 2013-04-02 20:08 /user/username/sample_data/tab1/tab1.csv

$ hdfs dfs -put tab2.csv /user/username/sample_data/tab2
$ hdfs dfs -ls /user/username/sample_data/tab2
Found 1 items
-rw-r--r--   1 username username        158 2013-04-02 20:09 /user/username/sample_data/tab2/tab2.csv

每个数据文件的名称并不重要。实际上,Impala在第一次检查数据目录的内容时,会考虑目录中的所有文件来组成表的数据,而不管有多少文件或文件名为什么。

要了解您自己的HDFS文件系统中可用的路径以及各种目录和文件的权限,请发出hdfsdfs-ls/并按自己的方式沿着树向下执行-ls各种目录的操作。

使用该impala-shell命令以交互方式或通过SQL脚本创建表。

以下示例显示了创建三个表。对于每个表,该示例显示了创建具有各种属性(例如布尔或整数类型)的列。该示例还包括提供有关如何格式化数据的信息的命令,例如以逗号结尾的行,这在从.csv文件导入数据的情况下很有意义。在.csvHDFS目录树中已经有包含数据的文件的地方,我们指定包含适当.csv文件的目录的位置。Impala考虑来自该目录中所有文件的所有数据来表示表的数据。

DROP TABLE IF EXISTS tab1;
-- The EXTERNAL clause means the data is located outside the central location
-- for Impala data files and is preserved when the associated Impala table is dropped.
-- We expect the data to already exist in the directory specified by the LOCATION clause.
CREATE EXTERNAL TABLE tab1
(
   id INT,
   col_1 BOOLEAN,
   col_2 DOUBLE,
   col_3 TIMESTAMP
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/username/sample_data/tab1';
DROP TABLE IF EXISTS tab2;
-- TAB2 is an external table, similar to TAB1.
CREATE EXTERNAL TABLE tab2
(
   id INT,
   col_1 BOOLEAN,
   col_2 DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/username/sample_data/tab2';
DROP TABLE IF EXISTS tab3;
-- Leaving out the EXTERNAL clause means the data will be managed
-- in the central Impala data directory tree. Rather than reading
-- existing data files when the table is created, we load the
-- data after creating the table.
CREATE TABLE tab3
(
   id INT,
   col_1 BOOLEAN,
   col_2 DOUBLE,
   month INT,
   day INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

注意:CREATETABLE成功通过这些语句是一个重要的验证步骤,以确认所有内容都使用HiveMetastore和HDFS权限正确配置。如果您在CREATETABLE报表期间收到任何错误:

  • 确保您严格按照Impala 安装的安装说明进行操作。
  • 确保该hive.metastore.warehouse.dir属性指向Impala可以写入的目录。所有权应该是hive:hive,并且impala用户也应该是hive组的成员。