我从上游获取数据作为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的新手。
答案 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', '')