我怎样才能忽略分号;在 & 当我从 .csv 文件创建 Hive 表时

Posted

技术标签:

【中文标题】我怎样才能忽略分号;在 & 当我从 .csv 文件创建 Hive 表时【英文标题】:How can I ignore the semicolon ; in the & when I am creating a Hive table from a .csv file 【发布时间】:2014-12-23 21:05:13 【问题描述】:

继续这个问题How can I make a Hive table from a .csv file which has one column with fields delimiited by semicolon ;

我的 csv 文件中的一些标题/出版商有“&amp”;在它们中以及包含它们的行被误读,因为它们在&符号代码中的分号和每个字段的末尾被过早拆分。

如何修改此代码:

CREATE TABLE books (ISBN STRING, Title STRING, Author STRING, Year STRING, Publisher STRING)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY "\;";
LOAD DATA INPATH '/path/to/my/datafile' INTO TABLE books;

所以它不这样做?

我的 csv 文件中的一个示例有问题的行是:

 0743403843;"Decipher";"Stel Pavlou";"2002";"Simon & Schuster (Trade Division)"

没有正确读取发布者列。

我知道我可以先清理 csv,然后再手动删除 (&amp);但能告诉我如何在 Hive 或 Hadoop 的其他工具中做到这一点?

【问题讨论】:

我有不同的方法,因为可以有 &同样在发布者列输出(或)其强制删除 &来自出版商专栏? 如果 &立即在标题列中,标题的一半在标题中,然后标题的下一部分在作者列中,实际作者在年份列中。等等。它被洒在 amepersand 代码中的分号上 &而不是分号,它实际上表示字段的结尾。 我遇到了你的问题,对于上述输入,这个输出是否可以? isbn=0743403843, title="Decipher", author="Stel Pavlou" , year="2002", publisher="Simon & Schuster (Trade Division)" ? no Publisher 列只有 Simon & 而不是 Simon &舒斯特(贸易部) 只是为了澄清我不介意 &在字段中,我只是不希望列因为 & 中的分号而过早地被删除 【参考方案1】:

你可以试试这个吗?

hive> CREATE TABLE test_regex(
    >     isbn STRING,
    >     title STRING,
    >     author STRING,
    >     year STRING,
    >     publisher STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
    >     WITH SERDEPROPERTIES ("input.regex" = 
    >     "(.*)\;\"(.*)\"\;\"(.*)\"\;\"(.*)\"\;\"(.*)\"",
    >     "output.format.string" = "%1$s %2$s %3$s %4$s %5s")
    >     STORED AS TEXTFILE;
OK
Time taken: 4.139 seconds

hive> load data local inpath 'input.csv' overwrite into table test_regex;
OK
Time taken: 0.393 seconds


hive> select isbn,publisher from test_regex;
ISBN    Publisher
0002005018  HarperFlamingo Canada
0399135782  Putnam Pub Group
0743403843  Simon & Schuster (Trade Division)
Time taken: 4.522 seconds

hive> select *from test_regex;
OK
ISBN    Title   Author  Year    Publisher
0002005018  Clara Callan    Richard Bruce Wright    2001    HarperFlamingo Canada
0399135782  The Kitchen God's Wife  Amy Tan 1991    Putnam Pub Group
0743403843  Decipher    Stel Pavlou 2002    Simon & Schuster (Trade Division)
Time taken: 0.253 seconds

【讨论】:

【参考方案2】:

这篇文章讨论了使用 CSV 并且引用的字符串包含逗号时的类似问题和解决方案:http://dev.bizo.com/2010/11/csv-and-hive.html

看起来他们链接到的 CSV-Serde 可以配置为备用分隔符,因此它也应该适用于您的格式。

【讨论】:

以上是关于我怎样才能忽略分号;在 & 当我从 .csv 文件创建 Hive 表时的主要内容,如果未能解决你的问题,请参考以下文章

我有 3 行的 SQLite 数据库,当我从行中删除数据时,数据会丢失但行仍然会,我怎样才能删除那个空白行?

C 编程:模数是不是忽略结果中的前导零?我怎样才能阻止它? [复制]

我怎样才能让这个 Map 双函数忽略/跳过空值?

如果没有数据返回,我怎样才能完全隐藏jqgrid?

我怎样才能确保我从这个回归生成器中得到正确的结果?

告诉LabelEnocder忽略新标签?