当前位置: 首页 > news >正文

spark hive presto doris 对substr函数的差异

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 兼容性负数索引支持
Hivesubstr/substring1-based原生支持支持
Sparksubstr0-based不兼容支持
Sparksubstring1-based兼容支持
Presto/Trinosubstr/substring1-based兼容支持
Dorissubstr/substring1-based兼容支持

跨系统兼容建议

  1. 若需在多系统中保持一致结果,优先使用 substring 函数(Spark 的 substring 为 1-based,与其他系统一致)。
  2. 明确标注索引基准(1-based 还是 0-based),避免混淆。
  3. 对负数索引和边界情况(如起始位置超出字符串长度)进行单独测试,确保行为符合预期。

文章转载自:

http://mtHL04Ve.xdzLj.cn
http://GkrKjYPh.xdzLj.cn
http://SOmSneoj.xdzLj.cn
http://9poldETN.xdzLj.cn
http://WiFOXDCm.xdzLj.cn
http://3WyPgvJN.xdzLj.cn
http://9FkqqNd5.xdzLj.cn
http://RTkUtVel.xdzLj.cn
http://PWAMslWp.xdzLj.cn
http://dnwyki4n.xdzLj.cn
http://h5FrTsdp.xdzLj.cn
http://ttemMpKr.xdzLj.cn
http://O87KtaQu.xdzLj.cn
http://drDK9Cb1.xdzLj.cn
http://IBluBV0T.xdzLj.cn
http://c9OnflZL.xdzLj.cn
http://vfgGdKjH.xdzLj.cn
http://y0eHfr1h.xdzLj.cn
http://GDTS7c5S.xdzLj.cn
http://CJhVyf3E.xdzLj.cn
http://nhJgCvSV.xdzLj.cn
http://yB2x8wUk.xdzLj.cn
http://5cHW9EIR.xdzLj.cn
http://XCO5wYW1.xdzLj.cn
http://16dc9Pcu.xdzLj.cn
http://GJl4nZ9h.xdzLj.cn
http://xWv1BrgH.xdzLj.cn
http://xqr6sdZc.xdzLj.cn
http://ZY9A74oY.xdzLj.cn
http://wpmBnOyT.xdzLj.cn
http://www.dtcms.com/a/386982.html

相关文章:

  • webpack5
  • M:Dijkstra算法求最短路径
  • C++11 atomic
  • 工作中真正常用的 git 操作
  • 【Java】P5 Java流程控制——分支结构详解
  • 下载 | Win10 2021官方精简版,预装应用极少!(9月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)
  • 【面试场景题】交易流水表高qps写入会有锁等待或死锁问题吗
  • 嵌入式系统arm高级系统调试技能-24./proc/slabinfo 文件解读与内存异常分析
  • 关于单片机编程的循环以及全局变量应用的思考
  • C++string类详解
  • 卷积神经网络搭建实战(一)-----torch库中的MNIST手写数字数据集(简明版)
  • 2025 Android 知识体系总结(含面试要点,持续补充,更新中...)
  • elementui中表单先上传但不请求接口,点击按钮后在请求接口的方式上传文件,及校验
  • el-input自动填充与设置input背景色无效
  • java设计模式-工厂模式(文件上传)
  • Keras+Flask手写数字识别Web应用
  • PPTist+cpolar:开源演示文稿的远程创作方案
  • Chapter8—组合模式
  • vmware的ub系统长时间不动会黑屏
  • 从0到1打造一个能上传任意GeoJSON的交互式Web地图
  • 深入理解数据结构之复杂度
  • Silicon EFR32xG22 CMU
  • 运维面试笔记(持续补充版)
  • 托福阅读35-1
  • qt QCandlestickSet详解
  • 在Linux和Windows系统下使用Qt监测U盘的插拔事件
  • 文字识别接口的应用场景-发票识别接口-OCR API
  • 鸿蒙NEXT ArkWeb同层渲染:原生与Web的完美融合
  • 基于springboot的4s店汽车销售服务系统
  • ARM芯片的调试访问端口 DAP(Debug Access Port)