数据操作
• LOAD DATA语句:向数据表内加载文件
• INSERT语句:将查询结果插入Hive表
LOAD DATA语句
一般来说,在SQL创建表后,我们就可以使用INSERT
语句插入数据。但在Hive中,可以使用LOAD DATA
语句插入数据。
同时将数据插入到Hive,最好是使用LOAD DATA
来存储大量记录。有两种方法用来加载数据:
• 从本地文件系统
• 从Hadoop文件系统
语法
#向数据表内加载文件
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-
Load
操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。 -
filepath
可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有文件移动至表所对应的目录中),通常包含以下三种路径:
• 相对路径,例如:project/data1
• 绝对路径,例如:/user/hive/project/data1
• 包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
- 加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名
-
LOCAL
关键字
如果指定了LOCAL
•load
命令会去查找本地文件系统中的filepath
。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:///user/hive/project/data1
.
•load
命令会将filepath
中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置
如果没有指定LOCAL
• 如果filepath
指向的是一个完整的 URI,hive 会直接使用这个 URI。 否则
• 如果没有指定schema
或者authority
,Hive 会使用在 hadoop 配置文件中定义的schema
和authority
,fs.default.name
指定了Namenode
的 URI
• 如果路径不是绝对的,Hive 相对于/user/
进行解释。 Hive 会将filepath
中指定的文件内容移动到table
(或者partition
)所指定的路径中 -
OVERWRITE
关键字
• 指定了OVERWRITE
• 目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath
指向的文件/目录中的内容添加到表/分区中。
• 如果目标表(分区)已经有一个文件,并且文件名和filepath
中的文件名冲突,那么现有的文件会被新文件所替代。
示例
我们将插入下列数据到表中。在/home/user
目录中名为sample.txt
的文件。
1201 Gopal 45000 Technical manager
1202 Manisha 45000 Proof reader
1203 Masthanvali 40000 Technical writer
1204 Kiran 40000 Hr Admin
1205 Kranthi 30000 Op Admin
下面的查询加载给定文本插入表中。
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
> OVERWRITE INTO TABLE employee;
下载成功完成,能看到以下回应:
OK
Time taken: 15.905 seconds
hive>
JDBC 程序
下面给出的是JDBC程序将给定的数据加载到表中。
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveLoadData {
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("LOAD DATA LOCAL INPATH '/home/user/sample.txt'" + "OVERWRITE INTO TABLE employee;");
System.out.println("Load Data into employee successful");
con.close();
}
}
将该程序保存在一个名为HiveLoadData.java文件。使用下面的命令来编译和执行这个程序。
$ javac HiveLoadData.java
$ java HiveLoadData
输出:
Load Data into employee successful
INSERT语句
INSERT OVERWRITE 覆盖数据
INSERT INTO 追加数据
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
将查询结果插入Hive表
#基本模式
INSERT TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)]
select_statement1 FROM from_statement
#多插入模式
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2]
...
#自动分区模式
INSERT OVERWRITE TABLE tablename
PARTITION (partcol1[=val1], partcol2[=val2] ...)
select_statement FROM from_statement
将查询结果写入HDFS文件系统
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
#数据写入文件系统时进行文本序列化,且每列用^A 来区分,\n换行