我正在尝试将Hive数据从一台服务器复制到另一台服务器。通过这个,我从server1导出hive数据到CSV并尝试将该CSV文件导入到server2中的Hive。
我的表包含以下数据类型:
BIGINT
的字符串
阵列
这是我的命令:
导出:
hive -e 'select * from sample' > /home/hadoop/sample.csv
导入
load data local inpath '/home/hadoop/sample.csv' into table sample;
导入Hive表后,整行数据只插入第一列。
如何克服这个问题,或者有更好的方法将数据从一台服务器复制到另一台服务器?
答案 0 :(得分:1)
创建表格时,在创建身份结尾处添加以下行
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
如下所示:
hive>CREATE TABLE sample(id int,
name String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
然后加载数据:
hive>load data local inpath '/home/hadoop/sample.csv' into table sample;
为您的示例
sample.csv
123,Raju,Hello|How Are You
154,Nishant,Hi|How Are You
因此,在上面的示例数据中,第一列为bigint
,第二列为String
,第三列为Array
,|
hive> CREATE TABLE sample(id BIGINT,
name STRING,
messages ARRAY<String>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|';
hive> LOAD DATA LOCAL INPATH '/home/hadoop/sample.csv' INTO TABLE sample;
最重要的一点:
定义集合项的分隔符,不要强加阵列 你在正常编程中做的结构。
另外,尽量做这个领域 分隔符不同于要避免的集合项分隔符 混乱和意想不到的结果。
答案 1 :(得分:1)
您确实不应该使用CSV作为数据传输格式
答案 2 :(得分:0)
为什么不使用hadoop命令将数据从一个集群传输到另一个集群,例如
bash$ hadoop distcp hdfs://nn1:8020/foo/bar \
hdfs://nn2:8020/bar/foo
然后将数据加载到新表
load data inpath '/bar/foo/*' into table wyp;
您的问题可能是由分隔符引起的
,默认分隔符'\001'
如果您在创建hivetable时没有设置..
如果你使用hive -e 'select * from sample' > /home/hadoop/sample.csv
将使所有cloumn为一个cloumn