【问题标题】:HIVE delimiter \n ^M issueHIVE 分隔符 \n ^M ​​问题
【发布时间】:2013-10-06 17:49:42
【问题描述】:

我有一个文件,其列由 ^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/';

但是,当我为该表执行选择语句时。结果一团糟。

表格如下所示:

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

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

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

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

【问题讨论】:

    标签: hadoop sed newline hive vi


    【解决方案1】:

    ^M 是 Vim 显示 Windows 行尾的一种方式。 这里有更多关于这个: What does ^M character mean in Vim?

    而 Hive 反过来使用 TextInputFormat 恰好将其视为有效的行终止符。

    根据您使用的 Hadoop 和 Hive 版本,可以有不同的方法来克服这个问题(从更改配置中的属性到自定义 InputFormat 实现)。

    只要找到一种明确指定分隔符的方法。

    是的,LINES TERMINATED BY '\n' 并不像它看起来的那样。 我正在使用 Hive 0.11,它的唯一可能值实际上是 '\n' 但它没有提升为 TextInputFormat

    【讨论】:

    • 这里有一张来自 Hadoop 的票,它解决了 TextInputFormat 的问题。也许在寻找具体解决方案时会对您有所帮助issues.apache.org/jira/browse/MAPREDUCE-2254
    • 感谢您的回答,我通过使用 sed -e 's/^M//g' 删除文件中所有现有的 ^M 来解决它,这似乎有效。但是修改配置文件肯定是长久之计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2011-04-15
    相关资源
    最近更新 更多