分享

hive实战经验:遇到问题总结

本帖最后由 pig2 于 2014-1-11 02:25 编辑

1.hive作业提交问题hive如何放到一个脚本中并行执行
有3个sql文件,a,b,c,需要并行执行,现在的做法是开3个hive的cli,分别运行a,b,c,比如有个个test.sh脚本内容如下
hive -f a.sql
hive -f b.sql
hive -f c.sql
然后去运行,结果成了跑完abc三个顺序运。


解决的办法:
hive -f a.sql
hive -f b.sql &
hive -f c.sql &

----------------------------------------------------------------------------------------------------------------------------------------------------
2.Hive查询表 数据全是NULL
sample.txt格式如下:
1  duck
2  chiken
3  pig
4  elephant
5  fish
6  monkey
7  donkey
8  duck
9  chiken
10  pig



HQL语句如下:create table animal(id INT,name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
LOAD DATA LOCAL INPATH '/tmp/sanple.txt' overwrite into table animal;
1353415282_3153.png

解决办法:
LOAD DATA LOCAL INPATH '/tmp/sanple.txt' overwrite into table animal  FIELDS TERMINATED BY '\t';
解释:
数据分隔符的问题,定义表的时候需要定义数据分隔符,
FIELDS TERMINATED BY '\t'
这个字段就说明了数据分隔符是tab。


Hive读到数据了,在反序列化数据的时候出错了。
-------------------------------------------------------------------------------------------------------------------------------------------------
3.hive读取二进制文件
建了一个有45个double类型组成的表:
create table dht_tab(name1 DOUBLE ,name2 DOUBLE, ... ,name45 DOUBLE);
本地磁盘上有个名为“dhtnew.dh”的一个数据,可看为45*n个DOUBLE型的2进制字节的顺序文件组成。
将其导入的语句是:
load data local inpath 'dhtnew.dh' overwrite into table dht_tab;
但是后来查看的时候表是空的,貌似全部违反了schema。

解决办法:
两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本



--------------------------------------------------------------------------------------------------------------------------------------------------
4.hive 分隔符
  1.    > CREATE TABLE IF NOT EXISTS testdb2.employees (
  2.     > name STRING COMMENT 'Employee name',
  3.     > salary FLOAT COMMENT 'Employee salary',
  4.     > subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
  5.     > deductions MAP<STRING, FLOAT>
  6.     > COMMENT 'Keys are deductions names, values are percentages',
  7.     > address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
  8.     > COMMENT 'Home address')
  9.     > COMMENT 'Description of the table'
  10.     > TBLPROPERTIES ('creator'='me', 'created_at'='2012-01-02 10:00:00');
  11. OK
  12. Time taken: 0.132 seconds
  13.     > load data local inpath '/tmp/zong'
  14.     > overwrite into table employees;   
  15. Copying data from file:/tmp/zong
  16. Copying file: file:/tmp/zong/hive_random_name.txt
  17. Loading data to table testdb2.employees
  18. Deleted hdfs://tkpcjk01-10:8020/user/hive/warehouse/testdb2.db/employees
  19. OK
  20. Time taken: 1.247 seconds
  21. 目录/tmp/zong  下只有一个文件,里面有三行文本:
  22. [root@tkpcjk01-11 zong]# cat /tmp/zong/hive_random_name.txt
  23. Mary Smith^A80000.0^ABill King^AFederal Taxes^C.2^BState Taxes^C.05^BInsurance^C.1^A100 Ontario St.^BChicago^BIL^B60601
  24. Todd Jones^A70000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.1^A200 Chicago Ave.^BOak Park^BIL^B60700
  25. Bill King^A60000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.1^A300 Obscure Dr.^BObscuria^BIL^B60100
  26. 加载到employee表中后,怎么三行记录都跑到 表中的 name 列了
  27.     > select * from employees;
  28. OK
  29. name        salary        subordinates        deductions        address
  30. Mary Smith^A80000.0^ABill King^AFederal Taxes^C.2^BState Taxes^C.05^BInsurance^C.1^A100 Ontario St.^BChicago^BIL^B60601        NULL        null        null        null
  31. Todd Jones^A70000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.1^A200 Chicago Ave.^BOak Park^BIL^B60700        NULL        null        null        null
  32. Bill King^A60000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.1^A300 Obscure Dr.^BObscuria^BIL^B60100         NULL        null        null        null
  33. Time taken: 0.337 seconds
复制代码
解决办法:

1.确定一下ctrl+A没问题
2.row format delimited fields terminated by '\t'将分隔符修改成 tab
3.尝试hive默认的分隔符是‘\001’
----------------------------------------------------------------------------------------------------------------------------------------------------
5.hive 如何安全退出
解决办法:
1.hive> exit;
2.hive>quit;
3.更安全的办法:
exit;
hadoop job -kill jobid
---------------------------------------------------------------------------------------------------------------------------------------------------
6.HIVE和HBASE数据对接
在Hbase中有一张表TB_1
FNAME:"C1
随后,在Hive中创建了一张映射表TB_1
当HBASE的数据发生改变时,Hive可以读取到
往HIVE里插入新数据后,HBASE里能看不到
解决办法:
HIVE的映射表无法更新HBASE中已存在的数据表
  1. --Hive SHELL
  2. --创建HIVE和HBASE表单
  3. CREATE TABLE hbase_table(key int, value string)  
  4. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  5. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,_0:val")  
  6. TBLPROPERTIES ("hbase.table.name" = "hive_table");
  7. --插入测试数据
  8. insert overwrite table hbase_table select key as key,'00' as Test from OtherHivetb;
  9. --HBASE SHELL
  10. scan 'hive_table',{LIMIT=>1};
复制代码




已有(2)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条