Spark、Hive、Presto(現更名為 Trino)和 Doris(原百度 Palo)的?substr
?函數在功能上都是用于截取字符串的子串,但在起始索引規則和參數含義上存在差異,這是導致結果不同的主要原因。以下是它們的具體區別:
1.?Hive
- 函數名:
substr
?或?substring
(兩者完全等效) - 起始索引:1-based(從 1 開始計數,第一個字符位置為 1)
- 參數格式:
substr(str, start_pos)
:從?start_pos
?位置截取到字符串末尾substr(str, start_pos, length)
:從?start_pos
?位置截取長度為?length
?的子串
- 負數索引:表示從字符串末尾開始計算(如?
start_pos=-3
?表示從倒數第 3 個字符開始) - 示例:
sql
select substr('abcdef', 2, 3); -- 結果:'bcd'(從第2位開始,取3個字符) select substr('abcdef', -3); -- 結果:'def'(從倒數第3位取到末尾)
2.?Spark
- 函數名:
substr
?和?substring
?行為不同(注意區分)substr
:0-based(從 0 開始計數,第一個字符位置為 0)substring
:1-based(為兼容 Hive 設計,與 Hive 行為一致)
- 參數格式:與 Hive 一致(支持 2 個或 3 個參數)
- 負數索引:與 Hive 一致(從末尾計數)
- 示例:
sql
-- substr(0-based) select substr('abcdef', 2, 3); -- 結果:'cde'(從第2位開始,取3個字符)-- substring(1-based,與 Hive 一致) select substring('abcdef', 2, 3); -- 結果:'bcd'(與 Hive 相同)
3.?Presto(Trino)
- 函數名:
substr
?或?substring
(兩者等效) - 起始索引:1-based(與 Hive 一致)
- 參數格式:
substr(str, start_pos)
:從?start_pos
?截取到末尾substr(str, start_pos, length)
:從?start_pos
?截取長度為?length
?的子串
- 負數索引:與 Hive/Spark 一致(從末尾計數)
- 特殊點:如果?
length
?為負數,返回空字符串(部分版本行為) - 示例:
sql
select substr('abcdef', 2, 3); -- 結果:'bcd'(與 Hive 一致) select substr('abcdef', -3); -- 結果:'def'(與 Hive 一致)
4.?Doris
- 函數名:
substr
?或?substring
(兩者等效) - 起始索引:1-based(與 Hive、Presto 一致)
- 參數格式:
substr(str, start_pos)
:從?start_pos
?截取到末尾substr(str, start_pos, length)
:從?start_pos
?截取長度為?length
?的子串
- 負數索引:支持(從末尾計數)
- 特殊點:如果?
start_pos
?超出字符串長度,返回空字符串 - 示例:
sql
select substr('abcdef', 2, 3); -- 結果:'bcd'(與 Hive、Presto 一致) select substr('abcdef', -3); -- 結果:'def'(與 Hive、Presto 一致)
總結:關鍵差異對比表
系統 | 函數名 | 起始索引 | 與 Hive 兼容性 | 負數索引支持 |
---|---|---|---|---|
Hive | substr/substring | 1-based | 原生支持 | 支持 |
Spark | substr | 0-based | 不兼容 | 支持 |
Spark | substring | 1-based | 兼容 | 支持 |
Presto/Trino | substr/substring | 1-based | 兼容 | 支持 |
Doris | substr/substring | 1-based | 兼容 | 支持 |
跨系統兼容建議
- 若需在多系統中保持一致結果,優先使用?
substring
?函數(Spark 的?substring
?為 1-based,與其他系統一致)。 - 明確標注索引基準(1-based 還是 0-based),避免混淆。
- 對負數索引和邊界情況(如起始位置超出字符串長度)進行單獨測試,確保行為符合預期。