【发布时间】:2013-08-08 01:37:41
【问题描述】:
我在 hive 表中有一个字符串列 description,其中可能包含制表符 '\t',但是当将 hive 连接到外部应用程序时,这些字符会弄乱一些视图。
有没有一种简单的方法来摆脱该列中的所有制表符?我可以运行一个简单的 python 程序来做到这一点,但我想为此找到一个更好的解决方案。
【问题讨论】:
我在 hive 表中有一个字符串列 description,其中可能包含制表符 '\t',但是当将 hive 连接到外部应用程序时,这些字符会弄乱一些视图。
有没有一种简单的方法来摆脱该列中的所有制表符?我可以运行一个简单的 python 程序来做到这一点,但我想为此找到一个更好的解决方案。
【问题讨论】:
regexp_replace UDF 执行我的任务。以下是 apache Wiki 的定义和用法。
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT):
这将返回替换INITIAL_STRING中的所有子字符串所产生的字符串
将PATTERN 中定义的java 正则表达式语法与REPLACEMENT 的实例相匹配,
例如:regexp_replace("foobar", "oo|ar", "") 返回fb
【讨论】:
自定义 SerDe 可能是一种方法。或者您可以使用某种带有 regex_replace 的中介过程:
create table tableB as
select
columnA
regexp_replace(description, '\\t', '') as description
from tableA
;
【讨论】:
select translate(description,'\\t','') from myTable;
通过将 from 字符串中的字符替换为 to 字符串中的相应字符来翻译输入字符串。这类似于 PostgreSQL 中的翻译功能。如果此 UDF 的任何参数为 NULL,则结果也为 NULL。 (从 Hive 0.10.0 开始可用,适用于字符串类型)
从 Hive 0.14.0 开始添加对 Char/varchar 的支持
【讨论】:
你也可以使用 translate()。如果第三个参数太短,则从第二个参数中删除相应的字符。与 regexp_replace() 不同,您无需担心特殊字符。 Source code.
【讨论】:
目前没有允许这样做的 OOTB 功能。实现这一目标的一种方法可能是编写一个自定义的 InputFormat 和/或 SerDe 来为您执行此操作。您可能对这个 JIRA 有用:https://issues.apache.org/jira/browse/HIVE-3751。 (虽然与您的问题没有直接关系)。
【讨论】: