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
二进制数据倒入HIVE前最好做一次ETl转换
看LZ都是用DOUBLE,不妨把二进制先转成DOUBLE,再倒入HIVE
当然,如果LZ一定要用HIVE直接保存二进制数据也可以
给你个链接 https://issues.apache.org/jira/browse/HIVE-637
介绍了如何用HIVE去处理二进制BLOB数据
#4
谢谢您的帮助,可我还是没有明白设置行列分隔符如何设置。因为我用row format delimited fields terminated by '\t'还是没有成功。数据都以字节挨着的,怎么能用\t呢。而且这我只是举个例子。实际上数据很大我无法转成double.本想建个表,45个double,3000个float列组成,数据都是按这个结构重复组成的。
#5
贴一行原始数据给我看看
#6
原始数据擦不多这样:用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,重整这些数据到文本
给你两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本
#9
谢谢,我在网上也没查到什么方法。貌似hive只有切割,没有按固定字节长度读取的方法。
#10
本以为Hive很强大呢,难道只能处理文本文件么?
木有知道解决办法的么?这周末结贴。
木有知道解决办法的么?这周末结贴。
#11
要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'
#12
我明白你的意思,但我要处理的文件是一个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进制字节,请问怎么设置行分隔符和列分隔符?
二进制数据倒入HIVE前最好做一次ETl转换
看LZ都是用DOUBLE,不妨把二进制先转成DOUBLE,再倒入HIVE
当然,如果LZ一定要用HIVE直接保存二进制数据也可以
给你个链接 https://issues.apache.org/jira/browse/HIVE-637
介绍了如何用HIVE去处理二进制BLOB数据
#4
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
贴一行原始数据给我看看
原始数据擦不多这样:用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,重整这些数据到文本
给你两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本
#9
这个有点无解了
给你两种解决方案
1、修改C Code,用文本输出,每个DOUBLE之间一个分隔符分割数据列
2、把原数据全部导入HDFS,然后写一个MAPREDUCE,重整这些数据到文本
谢谢,我在网上也没查到什么方法。貌似hive只有切割,没有按固定字节长度读取的方法。
#10
本以为Hive很强大呢,难道只能处理文本文件么?
木有知道解决办法的么?这周末结贴。
木有知道解决办法的么?这周末结贴。
#11
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?
要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'
#12
之前想到分隔符的事了,我要导入的是顺序文件,都是2进制字节,请问怎么设置行分隔符和列分隔符?
要看一下二进制的文件是什么编码的,ascii的考虑 '\001',unicode 可以考虑'\u0001'
我明白你的意思,但我要处理的文件是一个double8字节紧挨着另一个double的。所以不知道怎么让hive区分列。难道它不能自动按模式中类型的长度自动读取一定长度的字节么?
#13
楼主问题解决了吗?