Hive从CSV导入数据到表中的错误列

时间:2019-05-06 13:10:04

标签: csv hadoop hive

下面是我的表创建和csv中的示例;

DROP TABLE IF EXISTS xxx.fbp;
CREATE TABLE IF NOT EXISTS xxx.fbp (id bigint, p_name string, h_name string, ufi int, city string, country string)
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;
  

74905,xxx,xyz,-5420642,City One,France

     

74993,xxx,zyx,-874432,城市,德国

     

75729,xxx,yzx,-1284248,法国第二城市长名

然后我使用以下查询将数据加载到配置单元表中:

LOAD DATA
    INPATH '/user/xxx/hdfs_import/fbp.csv'
    INTO TABLE xxx.fbp;

似乎有数据从第5个csv“列”泄漏到表的第6列。因此,我在“国家/地区”列中看到城市数据。

SELECT country, count(country) from xxx.fbp group by country
+---------+------+
| country | _c1  |
| Germany | 1143 |
| City    |   1  |
+---------+------+

我不确定为什么偶尔将城市数据导入“国家/地区”列。该csv是从Google表格下载的,并且我已经删除了标题。

2 个答案:

答案 0 :(得分:0)

原因可能是您的行终止不是'\ n',基于Windows的工具添加了其他字符,这会引起问题。也可能是您使用列分隔符创建了该字段。

解决方案: 1.尝试通过“ where country = City”子句发出问题的打印行,这将使您了解Hive如何创建记录。 2.尝试二进制存储格式,以确保100%由Hive处理的数据。

希望有帮助。

答案 1 :(得分:0)

问题出在CSV本身内。有些列(例如p.name)在多个字段中包含,。这将导致行结束比预期的早。我必须清理数据并删除所有,。之后,它可以正确导入。使用python快速完成。

with open("fbp.csv") as infile, open("outfile.csv", "w") as outfile:
    for line in infile:
        outfile.write(line.replace(",", ""))