加载数据
有多种方式将数据加载到Hive表中。用户可以创建外部表,指向HDFS中的指定路径。在这种特殊用法中,用户可以使用HDFS put或者copy命令将文件复制到指定路径,然后使用所有相关行格式信息创建指向这个路径的Hive表。一旦完成,用户可以转换数据并将数据插入到其它任何Hive表中。例如,如果文件/tmp/pv_2008-06-08.txt
包含了2008-06-08以逗号分隔的页面浏览数据,这些数据需要加载到page_view
表的适当分区中,下面的命令可实现这个需求:
CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User',
country STRING COMMENT 'country of origination')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '12'
STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';
hadoop dfs -put /tmp/pv_2008-06-08.txt /user/data/staging/page_view
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='US')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip
WHERE pvs.country = 'US';
上面代码会出现由LINES TERMINATED BY
限制引发的错误。
FAILED: SemanticException 6:67 LINES TERMINATED BY only supports newline '\n' right now. Error encountered near token ''12''
在Hive学习指南(二)中说明过,行分隔符不能修改。
上面的实例中,page_view
表(参见Hive学习指南(二))中的数组和map类型都添加了null值,不过如果指定了合适的行格式,这些数据也可以来自于外部表。
如果HDFS上已经有一些数据了,在此基础上,用户想通过添加一些元数据实现在Hive中查询和操作这些数据的话,那么使用外部表这种加载数据的方式非常适用。
另外,系统支持从本地文件系统中直接加载数据到Hive表中,输入数据的格式和Hive表的格式是一致的。如果/tmp/pv_2008-06-08_us.txt
已经包含了US
数据,那么不需要像之前的示例那样进行过滤,适用下面的方式完成数据加载即可:
LOAD DATA LOCAL INPATH /tmp/pv_2008-06-08_us.txt INTO TABLE page_view PARTITION(date='2008-06-08', country='US')
路径参数可以是目录(目录中的所有文件都会被加载),单个文件名,或者是通配符(所有匹配文件都会被上传)。如果参数是目录,不能包含子目录。同样地,通配符也只能匹配文件名。
如果/tmp/pv_2008-06-08_us.txt
非常大,用户可以对数据进行并行加载(使用Hive的扩展工具)。一旦文件在HDFS中—下面的语法课用于将数据加载到Hive表中:
LOAD DATA INPATH '/user/data/pv_2008-06-08_us.txt' INTO TABLE page_view PARTITION(date='2008-06-08', country='US')
关于加载数据到Hive表的详细信息,请参见Hive Data Manipulation Language,创建外部表的示例请参见External Tables。