我有一个文件,其列由^ 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/';
但是,当我为该表执行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
然后我回到文本文件,发现文件中存在几个^ M字符,这使得HIVE将^ M视为新行字符。
当我第一次创建文件时,我故意从html中删除所有新行字符,以保证每条记录都是一行。但是,我只是无法理解HIVE如何将^ M视为换行符。如何在不修改文件的情况下解决这个问题。
(我知道有可能在VI或sed中进行全局替换......但它对我来说没有多大意义,HIVE如何将^ M视为\ n)
答案 0 :(得分:5)
^ M是Vim显示Windows行结尾的一种方式。 以下是对此的更多信息: What does ^M character mean in Vim?
而Hive又使用TextInputFormat,它恰好将其视为有效的行终止符。
根据您使用的Hadoop和Hive的版本,可以采用不同的方法来克服这种情况(从将配置中的属性更改为自定义的InputFormat实现)。
找到一种明确指定分隔符的方法。
是的,由'\ n'终止的LINES不会做它看起来像什么。 我正在使用Hive 0.11并且只有可能的值实际为'\ n'但它没有被提升为TextInputFormat