修改Hive中的数据有两种主要的方式:
加载文件到表中
HIVE在加载数据到表中的时候并不作任何的转换。现在的加载操作只是纯的复制/移动操作,将数据文件移动到对应的hive表的位置。
load data [local] inpath 'filepath' [overwrite] into table tablename [partition (parcol1=val1, partcol2=val2 ...)];
现在的加载操作只是纯的复制/移动操作,将数据文件移动到对应的hive表的位置。
-
. filepath可以使相对路径,比如:project/data1
. 绝对路径, 比如:/user/hive/project/data1
. 一个URI,比如:hdfs://namenode:9000/user/hive/project/data1
-
. 目标可以是一个标或者一个分区。如果在欢歌标识分区的,必须指明一个特殊的分区,每个分区字段都要填写。
. filepath可以使一个文件(将这个文件移动到表中)也可以是一个目录(将这个目录的所有的文件移动到表中)。两种情况都是文件集合的地 址。
. 如果指明了local:
load命令将在本地文件系统中寻找filepath。如果一个相对路径指明-它将被解释成用户的当前目录。用户也可以指定一个ie文件的统一资源定位符,如file:///user/hive/project/data1
. load命令将试filepath指明的地址下的所有的文件复制到目标文件系统。目标文件系统是通过查找表的位置属性来判断的。然后被复制的数据就被移动到表中了。
-
. 如果local没有被指定,如果指明了filepath, hive将使用filepath的全URI。否则遵循下面的规则:
如果scheme或者authority没有指定,hive将使用hadoop设置的变量fs.default.name指定的名字节点URI。
如果路径不是绝对的-然后hive将解释它成/user/<username>
hvie将移动filepath指定的文件到表或者分区中。
如果overwrite指定,目标表的内容将被删除,被filepath下的文件内容代替。否则俄新的文件内容将附加在表中。
注意,如果目标表或者分区已经有文件和filepath下的任何文件冲突-已经存在的文件将被新的文件代替。
注意:
filepath不能有子文件夹;
如果我们没用local-filepath必须指向和表或者分区在同一个文件系统下的文贱。
hive确实做一些检查来确定加载的数据与表匹配。现在它检查表是否以顺序格式存储-那样被加载的文件也市顺序文件,反之亦然。
从查询中插入数据到表中
查询结果可以通过使用insert子句插入到表中。
标准语法:inserty overwrite table tablename1 [partition (par=val1, par2=val2 ...)] select_statement1 from_statement;
hive扩展:
from from_statement
insert overwrite table tablename1 [partition (...)] select_statement1
[insert overwrite tabe tablename2 [partition...] select_statement2]...
Hive扩展:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement
从查询,写数据到文件
标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
hive扩展:
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...