SparkSQL数值模式详解

简介

函数如 to_number 和 to_char 确实支持在字符串类型和十进制(数值)类型之间进行转换。这些函数接受格式字符串作为参数,这些格式字符串指示了如何在这两种类型之间映射。

  • to_number:这个函数通常用于将字符串转换成数值类型。你需要提供一个格式字符串来指定如何解释字符串中的字符,以便正确地转换为数值。格式字符串定义了诸如小数点的位置、千位分隔符的存在与否等细节。
  • to_char:相反,这个函数用于将数值类型的数据转换成字符串形式。同样地,它也接受一个格式字符串来定义数值应该以何种格式输出。

语法

数值模式支持下面语法:

 { ' [ MI | S ] [ $ ] [ 0 | 9 | G | , ] [...] [ . | D ] [ 0 | 9 ] [...] [ $ ] [ PR | MI | S ] ' }

语法元素

每个数字格式字符串可以包含以下元素(不区分大小写):

  • 0 or 9
    指定一个介于0和9之间的预期数字。
    格式字符串中的0或9序列与大小相同或更小的数字序列相匹配。如果0/9序列以0开头并且在小数点之前,则需要精确匹配位数:解析时,它只匹配相同大小的数字序列;格式化时,结果字符串会在数字序列中添加带零的左填充,以达到相同的大小。否则,在解析时,0/9序列会匹配大小相同或更小的任何数字序列,并在格式化时在结果字符串中用空格(如果在小数点之前)或零(如果在整数点之后)填充数字序列。请注意,如果大小大于0/9序列,则格式化时数字序列将变为“#”序列。

  • . or D
    指定小数点的位置。此字符只能指定一次。
    解析时,输入字符串不需要包含小数点。

  • , or G
    指定分组(千)分隔符的位置。
    每个分组分隔符的左右两侧必须有0或9。解析时,输入字符串必须与与数字大小相关的分组分隔符匹配。

  • $
    此字符 $ 用于指定货币符号的位置。此字符在格式字符串中只能出现一次。

  • S
    此字符用于指定可选的正号 ‘+’ 或负号 ‘-’ 的位置。此字符在格式字符串中只能出现一次。

  • MI
    此字符用于指定可选的负号 ‘-’ 的位置。此字符在格式字符串中只能出现一次。

  • PR
    将负输入值映射到相应字符串中的尖括号(<1>)。
    正输入值不接受换行尖括号。

函数类型和错误处理

  • to_number函数接受输入字符串和格式字符串参数。它要求输入字符串与提供的格式匹配,否则会引发错误。然后,该函数返回相应的Decimal值。
  • try_to_nount函数接受输入字符串和格式字符串参数。它的工作原理与to_number函数相同,除了如果输入字符串与给定的数字格式不匹配,它将返回NULL而不是引发错误。
  • to_char函数接受输入小数和格式字符串参数。然后,函数返回相应的字符串值。
  • 如果给定的格式字符串无效,所有函数都将失败。

示例

以下示例使用to_number、try_to_nonumber和to_char SQL函数。
请注意,在大多数示例中使用的格式字符串都期望:

  • 开头有一个可选的符号(正负号),
  • 接着是一个美元符号 ($),
  • 然后是一个三到六位数的数字,
  • 千位分隔符,
  • 小数点后最多两位数字。
  1. to_number
-- The negative number with currency symbol maps to characters in the format string.
> SELECT to_number('-$12,345.67', 'S$999,099.99');-12345.67-- The '$' sign is not optional.
> SELECT to_number('5', '$9');Error: the input string does not match the given number format-- The plus sign is optional, and so are fractional digits.
> SELECT to_number('$345', 'S$999,099.99');345.00-- The format requires at least three digits.
> SELECT to_number('$45', 'S$999,099.99');Error: the input string does not match the given number format-- The format requires at least three digits.
> SELECT to_number('$045', 'S$999,099.99');45.00-- MI indicates an optional minus sign at the beginning or end of the input string.
> SELECT to_number('1234-', '999999MI');-1234-- PR indicates optional wrapping angel brakets.
> SELECT to_number('9', '999PR')9
  1. try_to_number
-- The '$' sign is not optional.
> SELECT try_to_number('5', '$9');NULL-- The format requires at least three digits.
> SELECT try_to_number('$45', 'S$999,099.99');NULL
  1. to_char
> SELECT to_char(decimal(454), '999');"454"-- '99' can format digit sequence with a smaller size.
> SELECT to_char(decimal(1), '99.9');" 1.0"-- '000' left-pads 0 for digit sequence with a smaller size.
> SELECT to_char(decimal(45.1), '000.00');"045.10"> SELECT to_char(decimal(12454), '99,999');"12,454"-- digit sequence with a larger size leads to '#' sequence.
> SELECT to_char(decimal(78.12), '$9.99');"$#.##"-- 'S' can be at the end.
> SELECT to_char(decimal(-12454.8), '99,999.9S');"12,454.8-"> SELECT to_char(decimal(12454.8), 'L99,999.9');Error: cannot resolve 'to_char(Decimal(12454.8), 'L99,999.9')' due to data type mismatch:Unexpected character 'L' found in the format string 'L99,999.9'; the structure of the formatstring must match: [MI|S] [$] [0|9|G|,]* [.|D] [0|9]* [$] [PR|MI|S]; line 1 pos 25

总结

在处理财务数据或其他需要精确格式化和解析数字的应用场景中,SparkSQL 提供了一系列强大的工具来帮助开发者以标准或自定义的方式格式化和解析数字。本文将介绍如何使用 to_number, try_to_numberto_char 函数来处理各种数字模式,并且提供一些具体的例子来展示这些功能的实际应用。

1. 数字格式化和解析的重要性

在数据分析中,正确地格式化和解析数字对于确保数据的一致性和准确性至关重要。例如,在处理货币金额时,我们通常希望保留两位小数,并且使用千位分隔符来提高可读性。此外,还需要能够正确处理带有符号的数字以及处理非标准的货币格式。

2. 使用 to_numbertry_to_number

to_numbertry_to_number 函数允许你根据给定的模式将字符串转换为数字。to_number 在遇到无法解析的字符串时会抛出异常,而 try_to_number 则会返回 NULL。

3. 使用 to_char

to_char 函数用于将数字转换为按照指定模式格式化的字符串。

4. 结论

通过使用 to_number, try_to_numberto_char 函数,我们可以有效地处理各种数字格式。这不仅提高了数据处理的效率,也确保了最终分析结果的准确性。掌握这些工具的使用方法对于任何进行数据处理和分析的人来说都是至关重要的技能。


以上就是关于 SparkSQL 中 Number Patterns for Formatting and Parsing 的基本介绍。希望这篇博客能够帮助你在实际项目中更好地应用这些功能。

参考文献

https://spark.apache.org/docs/latest/sql-ref-number-pattern.html

https://spark.apache.org/docs/latest/api/sql/ (可以查看方法是哪个spark版本引入,以及如何使用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在IDEA中使用Git

在IntelliJ IDEA&#xff08;通常简称为IDEA&#xff09;中使用Git进行版本控制是一种高效且集成度高的做法。以下是在IDEA中使用 Git的详细步骤和说明&#xff1a;一、安装与配置Git 安装Git&#xff1a; 前往Git的官方网站下载并安装Git。 安装过程中&#xff0c;建议勾选“…

泛微E9如何更新缓存

泛微E9如何更新缓存 在E9中&#xff0c;是默认开启了数据缓存的&#xff0c;如果直接操作数据库是会存在缓存不更新的问题&#xff0c;E9系统提供以下几种方式进行缓存清空的方式。 注&#xff1a;原则上禁止通过非程序渠道直接修改OA数据库数据&#xff0c;可以直接在页面进行…

flutter开发小技巧

Uri对象的使用 直接使用字符串来拼接 URI 地址需要关注地址中拼接的每个部分的合法性&#xff0c;并且在处理复杂逻辑时需要更冗长的处理&#xff0c;如果变量包含非法字符(如中文)&#xff0c;整个地址非法。 如&#xff1a;在路由跳转中使用 方式一&#xff1a;使用Uri对象…

clickhouse-neighbor 坑爹的排序

对于排序规则明显的数据集&#xff0c;使用neighbor来做分析&#xff0c;是一个非常强大的函数&#xff0c;能完成很多复杂的计算&#xff0c;例如高速公路分析车辆流量。 高速公路截面流量一般是通过路面上的门架采集设备采集通行卡的信息和识别牌照组成&#xff0c;在路面行驶…

Linux云计算 |【第二阶段】SECURITY-DAY3

主要内容&#xff1a; Prometheus监控服务器、Prometheus被监控端、Grafana监控可视化 补充&#xff1a;Zabbix监控软件不自带LNMP和DB数据库&#xff0c;需要自行手动安装配置&#xff1b;Prometheus监控软件自带WEB页面和DB数据库&#xff1b;Prometheus数据库为时序数据库&…

05:极限-无穷小

1.无穷小的概念及比较 定义&#xff1a; lim ⁡ x → x 0 f ( x ) 0 , 则称 f ( x ) 是 x x 0 时的无穷小 定义&#xff1a; \lim_{x \to x_0} f(x) 0,则称f(x)是xx_0时的无穷小 定义&#xff1a;x→x0​lim​f(x)0,则称f(x)是xx0​时的无穷小 性质Value①有限个无穷小相加还…

java 使用 aws s3 sdk 实现视频文件的分段下载来实现html 页面 video 的断点播放、拖动进度播放

参考博客&#xff1a; 1. Java 视频流分段返回 1. java 拉取 aws s3 视频流返回给浏览器&#xff1a; Overridepublic void playVideo(Long fileLength,String key,HttpServletRequest request,HttpServletResponse response) {OutputStream outputStream null;S3ObjectInputS…

JVM 运行时内存结构简介

JVM 运行时内存结构简介 一、前言二、JVM 运行时内存结构2.1 线程隔离数据区&#xff1a;2.2 线程共享数据区&#xff1a; 三、JVM 内存区域划分1. 程序计数器&#xff08;PC&#xff09;2. 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池 附录 一、前言 JVM&#…

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

手撕C++类和对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我 们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最 后两个取地址重载不…

Linux 内核源码分析---IPv6 数据包

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址。 由于IPv4最大的…

ES6 -- 总结 03

Es6的模块化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

鸿蒙Harmony开发——设备发烫问题分析

&#xff1b; 本文字数&#xff1a;4207字 预计阅读时间&#xff1a;25分钟 设备过热问题是影响用户体验和设备性能的重要因素。过热不仅会导致性能下降&#xff0c;还可能损坏硬件。因此&#xff0c;开发者需要及时发现、分析并解决这一问题。本文将首先介绍评估设备过热的关键…

文心快码(Baidu Comate)初体验

文心快码&#xff08;Baidu Comate&#xff09;初体验 1文心快码简介和安装&#xff1a;简要介绍文心快码&#xff08;Baidu Comate&#xff09;、安装方法、使用方法等&#xff1b; Baidu Comate 是由百度自主研发&#xff0c;基于文心大模型&#xff0c;结合百度丰富的编程现…

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中&#xff0c;寻找main函数在逆向分析中是非常重要的&#xff0c;它是程序的核心执行点&#xff0c;从这里开始&#xff0c;程序的主要逻辑开始展开&#xff1b;在这边我们需要明确两个概念&#xff1a;用户入口&#xff08;User Entry Point&#xff09; 和 …

(十二)Flink Table API

目录 Table API 案例 Table API 连接操作 Table API 是批处理和流处理的统一的关系型 API。Table API 的查询不需要修改代码就可以采用批输入或流输入来运行。Table API 是 SQL 语言的超集,并且是针对 Apache Flink 专门设计的。Table API 集成了 Scala,Java 和 Python 语言…

WIN 10 添加右键菜单(VSCode 打开当前目录)

WIN 10 添加右键菜单&#xff08;VSCode 打开当前目录&#xff09; 前言最终效果操作步骤 前言 每次打开代码都需要先打开 VSCode&#xff0c;再选择最近打开的项目或者浏览打开项目&#xff0c;感觉比较难找。所以自己添加了右键命令。 最终效果 操作步骤 cmd 打开注册表 找…

【Linux 从基础到进阶】Ceph分布式存储系统搭建

Ceph分布式存储系统搭建 引言 随着数据量的爆炸式增长,传统的存储解决方案逐渐暴露出扩展性差、成本高、管理复杂等问题。Ceph是一种高性能、可扩展的开源分布式存储系统,能够为对象存储、块存储和文件系统提供统一的存储平台。它基于无中心的架构设计,具有高可用性、可靠…

PyTorch 基础学习(13)- 混合精度训练

系列文章&#xff1a; 《PyTorch 基础学习》文章索引 基本概念 混合精度训练是深度学习中一种优化技术&#xff0c;旨在通过结合高精度&#xff08;torch.float32&#xff09;和低精度&#xff08;如 torch.float16 或 torch.bfloat16&#xff09;数据类型的优势&#xff0c;…

【Python】自然语言处理(NLP)技术简介

紧紧握着 青花信物 信守着承诺 离别总在 失意中度过 记忆油膏 反复涂抹 无法愈合的伤口 你的回头 划伤了沉默 &#x1f3b5; 周传雄《青花》 自然语言处理&#xff08;NLP&#xff09;技术是一种使计算机能够理解和处理人类自然语言的技术。以下是一些NLP…