如何在蜂巢中的多分隔符字符串上使用字符串拆分功能?

gok*_*oks 2 hadoop hive

我的字符串数据如下所示。

data = 'ABCD/~DEFG/~HJKL/~MNOP'
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询

select split(data,'[/~]')[1] from test_table;
Run Code Online (Sandbox Code Playgroud)

预期输出:ABCD原始输出:[SPACES]

当我尝试使用索引[2]进行相同的查询时,其工作原理。

select split(data,'[/~]')[2] from test_table;
Run Code Online (Sandbox Code Playgroud)

预期输出:DEFG原始输出:DEFG

我的观察:对于每个偶数索引数字(如0,2,4 ..),它都可以正常工作,并且为诸如1,3,5 ..的奇数索引数填充空格。

有人可以帮我解决这个问题。

Ron*_*tel 5

您需要使用split作为split('\\/~')

hive> select split('word1/~word2/~word3','\\/~')[0] as word1;
word1
Run Code Online (Sandbox Code Playgroud)

另外,请检查我的答案:使用和使用自定义分隔符数据加载到hive中,并使用以下MultiDelimitSerDe
其他选项regexp_extracthive-split-string-using-regex


例子:应该有一些简单的正则表达式来实现这一点,但是我下面的例子中想到了这个:

hive> select regexp_extract('word1/~word2/~word3','^(\\w.*)\\/~(\\w.*)$',2) as word3;
word3

hive> select regexp_extract('word1/~word2/~word3','^(?:([^/~]+)\\/~?){1}',1) as word1;
word1

hive> select regexp_extract('word1/~word2/~word3','^(?:([^/~]+)\\/~?){2}',1) as word2;
word2
Run Code Online (Sandbox Code Playgroud)