如何删除Hive表行中的^ M?

时间:2016-09-25 09:40:32

标签: hive

我从上游获取数据作为csv文件,并在其上创建Hive表。现在,一些csv文件包含几行/列的控制M字符。对于例如3列数据如下所示,对照M字符

abc^M,def,ghi
jkl,mno^M,pqr

现在我使用LOAD DATA INPATH '/path/to/file' INTO TABLE mytable将数据加载到Hive表中由于以上数据包含控件M Hive将其视为换行符并将该行拆分为新行,因此Hive表中的数据上方返回4行而不是2。 / p>

我尝试使用regex_replace(mycol,'[\x01-\x1A]',"\\")替换所有控制字符,包括控件M和\,它可以工作,但它留下\符号,例如abc^M将成为abc\我不想更改数据是否有更好的方法来执行此操作?我不确定即使是自定义serde也会在这种情况下提供帮助。我是Hive的新手。

2 个答案:

答案 0 :(得分:1)

您正尝试将^M替换为\,因此它会显示在您的最终结果中。用空字符串替换它。类似的东西:

regexp_replace(mycol, '[\x01-\x1A]', '')

另一方面,最好先清理文件,然后将其上传到HDFS中。

^M替换为源文件,然后上传会让事情变得更好。

示例代码:

$ tr -d '\015' < /path/to/file/file1 > /tmp/file1
$ LOAD DATA INPATH '/tmp/file1' INTO TABLE mytable

还有其他方法可以从文件中删除^M

答案 1 :(得分:1)

类似于在Vim中删除^ M的方法,例如:%s / \ r /,在Hive中,您可以尝试通过

删除它

regexp_replace(mycol, '\r', '')

对于删除Hive中特殊字符的常见方法,我通常这样做:

regexp_replace(mycol, '\r|\t|\n', '')