hive建表及导入数据的问题

时间:2022-10-19 00:16:05
本人hive菜鸟,刚尝试着将hadoop及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。这我很不理解。
请问是否我建表的语句有问题,过于简单了?那么正确的建表语句是什么?

13 个解决方案

#1


create table dht_tab(name1 DOUBLE ,name2 DOUBLE, ... ,name45 DOUBLE)row format delimited fields terminated by '\t';
--用制表符作为分隔符


load data local inpath 'LOCAL_PATH/dhtnew.dh' overwrite into table dht_tab fields terminated by '\t'
确认你要倒入文件的分隔符

#2


之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

#3


引用 2 楼 dlk004 的回复:
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?


二进制数据倒入HIVE前最好做一次ETl转换
看LZ都是用DOUBLE,不妨把二进制先转成DOUBLE,再倒入HIVE

当然,如果LZ一定要用HIVE直接保存二进制数据也可以
给你个链接 https://issues.apache.org/jira/browse/HIVE-637
介绍了如何用HIVE去处理二进制BLOB数据

#4


引用 1 楼 tntzbzc 的回复:
create table dht_tab(name1 DOUBLE ,name2 DOUBLE, ... ,name45 DOUBLE)row format delimited fields terminated by '\t';
--用制表符作为分隔符


load data local inpath 'LOCAL_PATH/dhtnew.dh' overwrite into table dht_tab fields terminated by '\t'
确认你要倒入文件的分隔符

谢谢您的帮助,可我还是没有明白设置行列分隔符如何设置。因为我用row format delimited fields terminated by '\t'还是没有成功。数据都以字节挨着的,怎么能用\t呢。而且这我只是举个例子。实际上数据很大我无法转成double.本想建个表,45个double,3000个float列组成,数据都是按这个结构重复组成的。

#5


贴一行原始数据给我看看 

#6


引用 5 楼 tntzbzc 的回复:
贴一行原始数据给我看看 

原始数据擦不多这样:用C操作的,
double a,b;
char* c = (char*)malloc(sizeof(double)*2);
memcpy(c,&a,8);memcpy(c,&b,8);
int h = open(filepath,wr);
write(h,c,16);

#7


原始数据也就是地震数据,如segy,segd等格式,通常比较庞大。

#8


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

#9


引用 8 楼 tntzbzc 的回复:
这个有点无解了
给你两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本

谢谢,我在网上也没查到什么方法。貌似hive只有切割,没有按固定字节长度读取的方法。

#10


本以为Hive很强大呢,难道只能处理文本文件么?
木有知道解决办法的么?这周末结贴。

#11


引用 2 楼 dlk004 的回复:
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'

#12


引用 11 楼 0flying0 的回复:
Quote: 引用 2 楼 dlk004 的回复:

之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'

我明白你的意思,但我要处理的文件是一个double8字节紧挨着另一个double的。所以不知道怎么让hive区分列。难道它不能自动按模式中类型的长度自动读取一定长度的字节么?

#13


楼主问题解决了吗?

#1


create table dht_tab(name1 DOUBLE ,name2 DOUBLE, ... ,name45 DOUBLE)row format delimited fields terminated by '\t';
--用制表符作为分隔符


load data local inpath 'LOCAL_PATH/dhtnew.dh' overwrite into table dht_tab fields terminated by '\t'
确认你要倒入文件的分隔符

#2


之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

#3


引用 2 楼 dlk004 的回复:
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?


二进制数据倒入HIVE前最好做一次ETl转换
看LZ都是用DOUBLE,不妨把二进制先转成DOUBLE,再倒入HIVE

当然,如果LZ一定要用HIVE直接保存二进制数据也可以
给你个链接 https://issues.apache.org/jira/browse/HIVE-637
介绍了如何用HIVE去处理二进制BLOB数据

#4


引用 1 楼 tntzbzc 的回复:
create table dht_tab(name1 DOUBLE ,name2 DOUBLE, ... ,name45 DOUBLE)row format delimited fields terminated by '\t';
--用制表符作为分隔符


load data local inpath 'LOCAL_PATH/dhtnew.dh' overwrite into table dht_tab fields terminated by '\t'
确认你要倒入文件的分隔符

谢谢您的帮助,可我还是没有明白设置行列分隔符如何设置。因为我用row format delimited fields terminated by '\t'还是没有成功。数据都以字节挨着的,怎么能用\t呢。而且这我只是举个例子。实际上数据很大我无法转成double.本想建个表,45个double,3000个float列组成,数据都是按这个结构重复组成的。

#5


贴一行原始数据给我看看 

#6


引用 5 楼 tntzbzc 的回复:
贴一行原始数据给我看看 

原始数据擦不多这样:用C操作的,
double a,b;
char* c = (char*)malloc(sizeof(double)*2);
memcpy(c,&a,8);memcpy(c,&b,8);
int h = open(filepath,wr);
write(h,c,16);

#7


原始数据也就是地震数据,如segy,segd等格式,通常比较庞大。

#8


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

#9


引用 8 楼 tntzbzc 的回复:
这个有点无解了
给你两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本

谢谢,我在网上也没查到什么方法。貌似hive只有切割,没有按固定字节长度读取的方法。

#10


本以为Hive很强大呢,难道只能处理文本文件么?
木有知道解决办法的么?这周末结贴。

#11


引用 2 楼 dlk004 的回复:
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'

#12


引用 11 楼 0flying0 的回复:
Quote: 引用 2 楼 dlk004 的回复:

之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?

要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'

我明白你的意思,但我要处理的文件是一个double8字节紧挨着另一个double的。所以不知道怎么让hive区分列。难道它不能自动按模式中类型的长度自动读取一定长度的字节么?

#13


楼主问题解决了吗?