在Hive中查询时删除Unicode字符

时间:2017-07-26 21:29:33

标签: sql regex hadoop unicode hive

我想清理unicode Hive表中的数据。以下是数据

select ('http://10.0.0.1/���m��v������)�a�^�����kn:4�+9x�2c��m�{��')

我需要的输出是查找我的列中是否有任何unicode字符并将其删除。这里的输出应该是,

http://10.0.0.1/

或完全为空。他们中的任何一个都没问题。如果一行包含任何unicode字符,则可以将其完全设为null。

以下是我的尝试,

 select REGEXP_REPLACE('http://10.0.0.1/���m��v������)�a�^�����kn:4�+9x�2c��m�{��', '\\[[:xdigit:]]{4}', '')

 select REGEXP_REPLACE('http://10.0.0.1/���m��v������)�a�^�����kn:4�+9x�2c��m�{��', '[||chr(128)||'-'||chr(255)||]', '')

Executed as Single statement.  Failed [40000 : 42000] Error while compiling statement: FAILED: ParseException line 1:193 mismatched input '<EOF>' expecting ) near ')' in function specification 
Elapsed time = 00:00:00.220 

STATEMENT 1: SELECT Statement failed. 

有人可以帮我清理这些吗?

由于

编辑:

哪些地方有效,

select REGEXP_REPLACE('"http://r.rxthdr.com/w?i=s�F�""�HY|�K�>�0����D����W8뤒�O0�Q�D�1��Vc~�j[Q��f��{u�Be�S>n���Ò���&��F9���C�i��8:ڔ�_@ĪO��K?�Ēc�6��=��v[�����D�$%��:�a�40ݩ�&O��K��""�0�a<x��TcX���b��TN�}�x�o��UY$K�I�Օ""��(+�M���E�=K�A�I�A���q#l�(�yt�5��h}��~[��YOA��G�=ïˆï¿½{���. �Q���ح;x=�s�0:�', '(?s).*\\P{ASCII}.*', '')

不工作的地方,

 select REGEXP_REPLACE('c4k0j,}W""d+2|4y0hkCkRh+.{pq80{?X8O>b<:ph.3!{T', '(?s).*\\P{ASCII}.*', '')

 select REGEXP_REPLACE('z|""},}69]6N2|c_;5.su={IU+|8ubq1<r$!Xxy#?Bhkv20:jXNgRh+5fwj:ndfWBJ}e)>','(?s).*\\P{ASCII}.*', '')

图像中的第一个具有unicode字符。但是,粘贴它成为一个点。

enter image description here

你可以帮我这么做吗?

2 个答案:

答案 0 :(得分:8)

您可以使用

select REGEXP_REPLACE(YOUR_STRING_HERE, '\\P{ASCII}.*', '')

它将从第一个找到的非ASCII字符中删除所有字符串。

Hive regex支持Unicode属性类,\p{ASCII}匹配任何ASCII字符。通过将p转换为大写形成相反的Unicode属性类。因此,\P{ASCII}匹配任何非ASCII的字符。 .*尽可能多地匹配任何0+字符,因为*贪心量词。

请注意,.默认情况下与换行符不匹配。如果您需要删除换行符,请在模式的开头添加(?s)

'(?s)\\P{ASCII}.*'

答案 1 :(得分:0)

如果您正在处理 URL,您可能需要考虑删除在 URL 上下文中被认为不安全的字符。从广义上讲,安全的 URL 字符是:

<块引用>

标准(安全)字符:

0 1 2 3 4 5 6 7 8 9
a b c d e f g h I j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

特殊字符:

$ – _ . + ! * ‘ ( ) ,

original article

在这种情况下,对我来说更自然的选择是以以下方式使用 regexp_extract

regexp_extract(question,'[a-zA-Z0-9\$\–\_\.\+\!\*\‘\(\)]*', 0)