hive的数据修改更新问题解决
2013-08-01 11:11
302 查看
由于hive是一个数据仓库。是一个基于日志的分析和统计。底层的数据应该是稳定的,与oracle不同的是,数据不是经常变化的。但是在日常的业务中经常有修改数据的需求。有的数据是经常变化的。需要维护一个经常变化的表。我通过一些项目,总结了一下几个方法:
1 如果数据量不大,可以尝试周期的覆盖原始数据的方法。根据需求,对数据进行周期的更新,再导入的时候对数据进行覆盖操作。
2 对数据库的数据或者日志进行一个更新日期的字段标注。如果数据量很大,那么就每天导入最新的数据。当然这样就是有一条数据,不同的更新日期的数据。这样在查询的时间取最新的时间进行统计。这样可以根据更改时间,解决数据更新的需求。维护一个最新的状态。
一下是第一种方案的例子:
加载数据到表时,hive不会做任何转换。加载操作是纯粹的复制/移动操作,移动数据文件到相应的hive表。
语法
实例
假设hive的warehouse目录是/user/hadoop/warehouse,这里有一个login表
对应有一个用户登录日志文件,文件内容如下:
注意,列与列之间是用','号隔开,第一列是uid,第二列是用户ip。
接着加载数据
这表示从本地磁盘,把文件 '/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格式 - 正在加载的文件是反序列化。
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格式 - 正在加载的文件是反序列化。
相关文章推荐
- VX中解决在绑定数据后没有及时更新的问题
- 使用租约机制解决缓存数据更新的问题
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- WPF:解决数据绑定时不更新数据的问题
- 解决TextView数据不能更新的问题以及Android Button事件响应函数的两种方法
- Hive 插入数据时遇到Return Code 2问题的解决
- jquery ajax禁用缓存解决ie数据不更新的问题
- 解决前台向mysql更新数据的编码问题
- 解决SpringBoot更新数据到MySQL乱码问题
- 解决SpringBoot更新数据到MySQL乱码问题
- Mybaits更新数据1不可修改为0的问题
- 解决Oracle LogMiner获取数据字典文件需要修改UTL_FILE_DIR的问题
- jquery 请求ie缓存,数据不更新的问题【ajax禁用缓存解决ie数据不更新的问题】
- 如何解决热点数据更新问题
- 用SynchronizationContext解决界面的更新线程数据问题
- 关于Hibernate设置一对多关系时更新一方数据时多方外键丢失问题解决
- play框架数据修改 - Ebean.update(bean)失败问题解决
- java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题
- 解决SpringBoot更新数据到MySQL乱码问题
- 解决SpringBoot更新数据到MySQL乱码问题