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

来源:互联网 发布:mysql 快照备份 编辑:程序博客网 时间:2024/05/18 05:11

由于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 DELIMITEDFIELDS TERMINATED BY ','STORED AS TEXTFILE;
复制代码

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

888,8.8.8.8999,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格式 - 正在加载的文件是反序列化。

 

 

原创粉丝点击