加载到Hive表中仅将导入的整个数据导入第一列

时间:2018-04-24 05:30:39

标签: sql database hadoop hive

我正在尝试将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表后,整行数据只插入第一列。

如何克服这个问题,或者有更好的方法将数据从一台服务器复制到另一台服务器?

3 个答案:

答案 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