【问题标题】:How to remove ^M in a Hive table row?如何删除 Hive 表行中的 ^M?
【发布时间】:2016-09-25 09:40:31
【问题描述】:

我从上游获取数据作为 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。

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

【问题讨论】:

  • 为什么不使用regex_replace(mycol,'[\x01-\x1A]','')

标签: hive


【解决方案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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      相关资源
      最近更新 更多