HIVE分隔符\n ^ M问题

B.M*_*.W. 4 vi hadoop hive newline sed

我有一个文件,其列由^ A分隔,行由'\n'换行符号.

我首先将它上传到HDFS,然后使用如下命令在Hive中创建表:

CREATE EXTERNAL TABLE 
IF NOT EXISTS 
html_sample 
( ts string, 
  url string, 
  html string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
LINES TERMINATED BY '\n' 
LOCATION '/tmp/directoryname/';
Run Code Online (Sandbox Code Playgroud)

但是,当我为该表执行select语句时.结果是一团糟.

该表如下所示:

ts              url                    html
10082013        http://url.com/01      <doctype>.....style="padding-top: 10px;
text-align...   NULL                   NULL 
text-align...   NULL                   NULL
text-align...   NULL                   NULL
10092013        http://url.com/02      <doctype>.....style="padding-top: 10px;
text-align...   NULL                   NULL 
text-align...   NULL                   NULL
text-align...   NULL                   NULL
Run Code Online (Sandbox Code Playgroud)

然后我回到文本文件,发现文件中存在几个^ M字符,这使得HIVE将^ M视为新行字符.

当我第一次创建文件时,我故意从html中删除所有新行字符,以保证每条记录都是一行.但是,我只是无法理解HIVE如何将^ M视为换行符.如何在不修改文件的情况下解决这个问题.

(我知道有可能在VI或sed中进行全局替换......但它对我来说没有多大意义,HIVE如何将^ M视为\n)

ybo*_*nar 5

^ M是Vim显示Windows行结尾的一种方式.这里有更多内容: ^ M字符在Vim中意味着什么?

而Hive又使用TextInputFormat,它恰好将其视为有效的行终止符.

根据您使用的Hadoop和Hive的版本,可以采用不同的方法来克服这种情况(从将配置中的属性更改为自定义的InputFormat实现).

只需找到一种明确指定分隔符的方法.

是的,'\n'终止的LINES不会做它看起来像什么.我正在使用Hive 0.11并且只有可能的值实际上是'\n'但它没有被提升为TextInputFormat

  • 这是来自Hadoop的一张票,用于解决TextInputFormat的问题.也许在寻找具体解决方案时对您有所帮助https://issues.apache.org/jira/browse/MAPREDUCE-2254 (2认同)