配置单元分隔符\n^m问题

puruo6ea  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(355)

我有一个文件,其列由^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字符,这使得配置单元将该^m视为新行字符。
当我第一次创建文件时,我特意从html中删除了所有新行字符,以保证每条记录都是一行。然而,我就是不明白Hive究竟是怎么把一个^m当作换行符的。我怎样才能在不修改文件的情况下解决这个问题。
(我知道在vi或sed中进行全局替换是可能的。。。但这对我来说没有多大意义Hive怎么能把^m当作\n)

wnrlj8wa

wnrlj8wa1#

^m是vim显示windows行结束的一种方式。这里有更多关于这个:在vim中,^m字符意味着什么?
而hive则使用textinputformat,它恰巧将其视为有效的行终止符。
根据您使用的hadoop和hive的版本,可以有不同的方法来克服这个问题(从更改config中的属性到定制inputformat实现)。
只需找到一种明确指定分隔符的方法。
是的,以'\n'结尾的行并不像它看起来那样。我正在使用配置单元0.11,它的唯一可能值实际上是'\n',但它没有升级为textinputformat

相关问题