加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

hive的load命令及常见load错误

(2015-04-30 21:38:16)
标签:

杂谈

转自:http://www.i8788.com

sql优化网

对于初学hive的同学来说,有可能很多小问题长长会困扰你,首先的问题就是建表及load的问题,建好表后load数据,发现字段有的空是常事,下面就我的经验,跟大家分享下,hive load数据时常见的错误

首先去下载我准备的数据 http://pan.baidu.com/s/1bns3wwJ
部分数据示例如下:

1000001754085 中国工商银行 2014-05-1913:58:00 1.0

1000001754085 中国工商银行 2014-05-1913:57:59 1.0

1000001754085 中国工商银行 2014-05-1913:57:57 1.0

1000001918152 中国建设银行 2014-05-1815:01:59 678.0

1000001882307 中国建设银行 2014-05-1516:48:02 1000.0

1000001882307 中国建设银行 2014-05-1516:52:03 3800.0

1000001882307 中国建设银行 2014-05-1600:15:58 3000.0

1000001967226 中国建设银行 2014-05-2015:51:55 800.0

1000001787148 中国建设银行 2014-05-0818:46:02 800.0

1000001787148 中国建设银行 2014-05-0821:02:01 200.0

首先要建表,建表语句如下(无分区时)

 

create table tmp.hive_sum (

id string COMMENT '会员ID',

bank_name string COMMENT '银行名称',

create_time string COMMENT '交易时间',

amount double COMMENT '交易金额'

) COMMENT 'hive_sum顶级应用'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LINES TERMINATED BY '\n';

1、建表时要注意字段类型,根据数据发现,第一列是一串数字,这时第一列的字段类型可以为string,也可以为bigint,如果写成double
的话也不会报错,不过类型跟你想要的就不一样了,写成int就会显示为null;
为int时load结果

NULL    招商银行        2014-05-08 18:38:56     1000.0

NULL    招商银行        2014-05-09 00:05:03     1000.0

NULL    招商银行        2014-05-10 09:40:18     1000.0

NULL    招商银行        2014-05-15 14:02:30     1000.0

NULL    招商银行        2014-05-15 15:49:38     1000.0

为bigint时结果:

1000001786530   招商银行        2014-05-09 00:05:03     1000.0

1000001786530   招商银行        2014-05-10 09:40:18     1000.0

1000001880732   招商银行        2014-05-15 14:02:30     1000.0

1000001882158   招商银行        2014-05-15 15:49:38     1000.0

为double时显示结果

1.00000178653E12        招商银行        2014-05-09 00:05:03     1000.0

1.00000178653E12        招商银行        2014-05-10 09:40:18     1000.0

1.000001880732E12       招商银行        2014-05-15 14:02:30     1000.0

1.000001882158E12       招商银行        2014-05-15 15:49:38     1000.0

1.000001881484E12       招商银行        2014-05-15 15:50:20     1000.0

2、第二列必须写成string类型,写成其他类型就会为空;第四列可以为string,或者double,写成int或者bigint也不会报错,
不过数据会被截断
第三列int效果如下:

1000001919532   建设银行        2014-05-19 11:08:46     900

1000001919646   建设银行        2014-05-19 11:16:15     100

1000001919532   建设银行        2014-05-19 11:07:48     100

1000001919646   建设银行        2014-05-19 11:13:04     1000

所以数据类型很重要,千万别写错

3、ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’这段的意思是字段与字段之间用\t分割,所以load数据之前要看看你文件的分割符是不是\t,如果不是就会出错,后面很多null等着你哦。当 然分隔符你可以自己指定,可以是‘,’逗号,冒号‘:’等,不过特殊字符要转义哦,并且保证你要导入的文本字段分割跟你的分隔符想匹配,字段与字段直接除 分隔符外不要有其它符合哦。
4、LINES TERMINATED BY ‘\n’是指换行符用\n,这个一般都不会出错
5、如果你是初学者,压缩就不必了,外部表指定以后再说吧还是
6、load语句。load data local inpath ‘/data/tmp/tqc/hive_sum.txt’ overwrite into table tmp.hive_sum,local inpath是指你文件的上传目录,如果你的文件在hdfs上,就不要家‘local’字段了,’/data/tmp/tqc /hive_sum.txt’ 是指文件的绝对路径,当然你也可以写成相对路径(如果你足够自信的话)。overwrite into是指每次加载都覆盖原数据,如果不想覆盖的话,就去掉overwrite吧。
7、如果你要建分区表,只需加个分区字段就可以,可以有多个分区,code如下:

create table tmp.hive_sum5 (
id string COMMENT ‘会员ID’,
bank_name string COMMENT ‘银行名称’,
create_time string COMMENT ‘交易时间’,
amount int COMMENT ‘交易金额’
)
COMMENT ‘hive_sum顶级应用’ partitioned by (hour int, dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’;

注意分区要写在表备注后面
load语句同样发生了变化

load data local inpath '/data/tmp/tqc/hive_sum.txt' overwrite into table tmp.hive_sum5 partition(hour=13,dt='2014-06-18');

注意到没,多了partition(hour=13,dt=’2014-06-18′),partition字段一定要加的,hour和dt必须 写,如果你不指定分区的值,不好意思,不支持哦。你想指定成随机值,不好意思,load不可以,insert到是可以,不过要用动态分区,什么是动态分区 啊,百度吧先。
结果如下

1000001786530   招商银行        2014-05-08 18:38:56     1000    13      2014-06-18

1000001786530   招商银行        2014-05-09 00:05:03     1000    13      2014-06-18

1000001786530   招商银行        2014-05-10 09:40:18     1000    13      2014-06-18

1000001880732   招商银行        2014-05-15 14:02:30     1000    13      2014-06-18

1000001882158   招商银行        2014-05-15 15:49:38     1000    13      2014-06-18

8、其它错误

a.加载有乱码,那肯定是load文件格式跟你设定的格式不一样,load文本一般要设置成utf-8格式

b.第一个字段是乱码,那怎么办?那是说明文本第一个字符那不是utf-8的,编辑模式下删掉第一个字符再敲上去,应该就可以了,在不行的话,重新导份上去吧

应该比较详细了吧,如果在实际load中遇到了其它问题,欢迎留言

如喜欢文本,欢迎转载,转载请注明:http://www.i8788.com

转载请注明:sql优化网 >> hive的load命令及常见load错误


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有