您的位置:首页 > 其它

hive的数据修改更新问题解决

2013-08-01 11:11 302 查看
由于hive是一个数据仓库。是一个基于日志的分析和统计。底层的数据应该是稳定的,与oracle不同的是,数据不是经常变化的。但是在日常的业务中经常有修改数据的需求。有的数据是经常变化的。需要维护一个经常变化的表。我通过一些项目,总结了一下几个方法:

1 如果数据量不大,可以尝试周期的覆盖原始数据的方法。根据需求,对数据进行周期的更新,再导入的时候对数据进行覆盖操作。

2 对数据库的数据或者日志进行一个更新日期的字段标注。如果数据量很大,那么就每天导入最新的数据。当然这样就是有一条数据,不同的更新日期的数据。这样在查询的时间取最新的时间进行统计。这样可以根据更改时间,解决数据更新的需求。维护一个最新的状态。

一下是第一种方案的例子:

加载数据到表时,hive不会做任何转换。加载操作是纯粹的复制/移动操作,移动数据文件到相应的hive表。

语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]


实例

假设hive的warehouse目录是/user/hadoop/warehouse,这里有一个login表

CREATE TABLE login (
uid  BIGINT,
ip  STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;


对应有一个用户登录日志文件,文件内容如下:

888,8.8.8.8
999,9.9.9.9


注意,列与列之间是用','号隔开,第一列是uid,第二列是用户ip。

接着加载数据

LOAD DATA LOCAL INPATH '/data/login/20130101.csv' OVERWRITE INTO TABLE login PARTITION (dt='20130101');


这表示从本地磁盘,把文件 '/data/login/20130101.csv' 拷贝到表login,分区dt为'20130101'的目录(在HDFS)下.加载成功后,20130101.csv会放置在 hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

OVERWRITE表示目标表(或分区)在数据加载前会删除,然后替换为新的数据。如果不指定OVERWRITE,则会追加数据到目标表(或分区)下,如果文件名和目标目录的文件冲突,会自动改名。

LOCAL如果不指定,就是从HDFS的'/data/login/20130101.csv'移动数据到表login,分区分区dt为 '20130101'的目录下。即是,原来的HDFS文件'/data/login/20130101.csv'是被移动到hdfs: //namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

注意:加载的文件名不能是一个子目录,hive做一些最简单的检查,以确保正在加载的文件和目标表匹配。目前,它会检查,如果该表存储为sequencefile格式 - 正在加载的文件是反序列化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐