结论:
split函数在spark3和presto中,虽然用法一样,但传递分隔符参数时不同,Spark的分隔符参数是一个正则表达式,如果要用.点号等分割,需要双反斜杠 \\
转义。presto中是普通字符串。
一、在spark中:
使用 split
函数分割字符串时,输入的分隔符参数是一个正则表达式,而不是一个常规的字符串。在正则表达式中,点号 .
表示匹配任意单个字符,因此在使用 split
函数时,需要对点号进行转义,表示点号的字面上的意义。在 Spark SQL 中使用 split
函数分割包含点号的字符串时,应该使用双反斜杠 \\.
进行转义。
例如,如果你的字段 col1 的值为 '11.1',你可以使用以下代码在 Spark SQL 中使用 split
函数分割:
SELECT split(col1, '\\.');
上述代码会得到 ['11', '1']
这个结果,其中第一个元素是点号之前的字符串,第二个元素是点号之后的字符串。如果使用未转义的点号作为分隔符,则会将字段的每个字符都当做一个分割符来处理,从而导致结果为空。因此在使用 split
函数时,需要注意传入的分隔符是否需要进行转义。
二、为什么presto中不需要转义
在 Spark SQL 和 Presto 中,split()
函数的用法是一致的,但在传递分隔符参数时,Spark SQL 和 Presto 有所不同。在 Presto 中,在 split()
函数中传递分隔符时,分隔符参数使用普通字符串格式,而不需要进行转义。Presto 的 split()
函数会将传递的字符串参数按照普通字符串处理,而不是按照正则表达式处理。
因此,在 Presto 中使用 split()
函数拆分点号 .
分隔的字符串不需要转义,可以直接使用单个点号 .
作为分隔符。例如,如果你的字段 col1 的值为 '11.1',你可以使用以下代码在 Presto 中使用 split()
函数分隔:
SELECT split(col1, '.');
上述代码会得到 ['11', '1']
这个结果,与 Spark SQL 中使用转义后的点号作为分隔符得到的结果是一致的。
三、为什么使用双反斜杠//
在 Java 等很多编程语言中,\
是一种转义字符,它可以将其后面的字符进行转义,表示为特定的含义。例如,\n
表示换行符,\t
表示制表符。在 Spark SQL 中,使用 split
函数传入分隔符时,由于分隔符本身也是一个字符,因此需要使用转义字符将其进行转义。
但是在许多编程语言中,包括 Java 在内,\
本身也是一个转义字符,因此如果直接使用 split
函数时只使用一个 \
进行转义,实际传入的分隔符可能并不是我们想要的字符,而是其它的字符或组合。因此,在使用 split
函数时,需要使用两个 \
进行转义,才能确保正确地匹配想要的字符。
在我们的例子中,我们想要使用 .
做为分隔符,因此我们需要使用 '\\.'
作为参数传入 split
函数中。这里的 \\
表示一个反斜线字符,它本身是需要进行转义的,而 .
则表示点号字符本身。两者连在一起的转义字符 \\.
表示点号字符的字面意义,从而确保分隔符被正确地匹配。
版权归原作者 m0_72187251 所有, 如有侵权,请联系我们删除。