0


split函数在spark和presto/hive中的区别

结论

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 函数中。这里的 \\ 表示一个反斜线字符,它本身是需要进行转义的,而 . 则表示点号字符本身。两者连在一起的转义字符 \\. 表示点号字符的字面意义,从而确保分隔符被正确地匹配。

标签: sql

本文转载自: https://blog.csdn.net/m0_72187251/article/details/130433084
版权归原作者 m0_72187251 所有, 如有侵权,请联系我们删除。

“split函数在spark和presto/hive中的区别”的评论:

还没有评论