【发布时间】:2018-06-26 21:34:05
【问题描述】:
如何将字符串转换为字符数组,例如
"abcd" -> ["a","b","c","d"]
我知道拆分方法:
SELECT split("abcd","");
#["a","b","c","d",""]
是最后一个空格的错误吗?或任何其他想法?
【问题讨论】:
如何将字符串转换为字符数组,例如
"abcd" -> ["a","b","c","d"]
我知道拆分方法:
SELECT split("abcd","");
#["a","b","c","d",""]
是最后一个空格的错误吗?或任何其他想法?
【问题讨论】:
这实际上不是一个错误。 Hive split function 只需调用底层 Java String#split(String regexp, int limit) 方法,并将 limit 参数设置为 -1,这会导致返回尾随空格。
我不打算深入研究为什么会发生这种情况的实现细节,因为已经有一个 brilliant answer 描述了这个问题。请注意,str.split("", -1) 将根据您使用的 Java 版本返回不同的结果。
一些替代方案:
"(?!\A|\z)" 作为分隔符正则表达式,例如split("abcd", "(?!\\A|\\z)")。这将使正则表达式匹配器在字符串的开始和结束位置跳过 零宽度匹配。String#toCharArray(),或接受 limit 作为 UDF 的参数,因此您可以将其用作:SPLIT("", 0)
【讨论】:
我不知道这是一个错误还是它的工作原理。作为替代方案,您可以使用 explode 和 collect_list 从 where 子句中排除空格
SELECT collect_list(l)
FROM ( SELECT EXPLODE(split('abcd','') ) as l ) t
WHERE t.l <> '';
【讨论】:
collect_list 方法,但是拆分的结果令人困惑。