首页 > 数据库 >SparkSQL数值模式详解

SparkSQL数值模式详解

时间:2024-08-26 12:53:05浏览次数:13  
标签:数字 number 数值 char 详解 SparkSQL 字符串 格式 SELECT

简介

函数如 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 format
  string 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。

示例:

假设我们有一个包含货币金额的列,该列中的数据格式为 $1,234.56,我们想要将其转换为数字类型。

SELECT to_number(column_name, '[$$]s999,999.99') AS parsed_number
FROM table_name;

这里 '[$$]s999,999.99' 是一个模式字符串,[$$] 表示货币符号,s 表示可选的符号(正负号),999,999.99 表示一个三到六位数的数字,包括小数点后的两位数字。

3. 使用 to_char

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

示例:

如果我们要将一个数字列转换为带有货币符号和千位分隔符的字符串,我们可以这样做:

SELECT to_char(column_name, '[$$]s999,999.99') AS formatted_number
FROM table_name;
4. 格式字符串详解
  • [$$] 表示货币符号,这里使用两个 $ 是因为 SQL 字符串中 $ 是一个特殊字符。
  • s 表示可选的符号。
  • 999,999.99 表示一个三到六位数的数字,其中 , 代表千位分隔符,.99 表示最多两位小数。
5. 结论

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


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

参考文献

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

标签:数字,number,数值,char,详解,SparkSQL,字符串,格式,SELECT
From: https://blog.csdn.net/Android_xue/article/details/141559160

相关文章

  • 【JS逆向百例】携某 testab 参数补环境详解
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • Access-Control-Allow- 设置 跨域资源共享 CORS 详解
    跨域访问的项目常在过滤器或者拦截器中添加如下配置   response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","POST,OPTIONS,GET");response.setHeader("Access-Control-Max-Age&qu......
  • 10、Flink动态表之 DataStream 上的关系查询详解
    a)DataStream上的关系查询下表比较了传统的关系代数和流处理与输入数据、执行和输出结果的关系。关系代数/SQL流处理关系(或表)是有界(多)元组集合。流是一个无限元组序列。对批数据(例如关系数据库中的表)执行的查询可以访问完整的输入数据。流式查询在启动时不能访问......
  • 红黑树原理详解
    文章目录红黑树原理详解一、引言二、红黑树的基本性质1、基本性质2、红黑树的效率三、红黑树的操作1、插入操作1.1、插入节点1.2、调整颜色和结构1.3、修复2、删除操作2.1、删除节点2.2、调整颜色和结构2.3、修复四、总结红黑树原理详解一、引言红黑树(Red-Blac......
  • mysqldump的使用详解
    一、mysqldump简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。二、备份命令2.1命......
  • SpringAOP使用详解
    AOP使用详解首先创建maven项目添加依赖在pom.xml里创建三层结构和spring.xml文件,只要用到注解就得写扫描包在spring.xml里上篇文章的知识点总结对上篇文章excution详细解释如果把前置通知修改成这个代表只有带有@Logger注解的才会生效合并注解的方法用&&在be......
  • golang interface{} Type assertions类型断言 x.(T) 和Type switches类型选择 switch
    在golang的开发中,我们经常会用到类型断言typeassertions和switchx.(type)类型选择,他们都可以对interface{}空接口类型的数据进行类型断言,他们的功能类似但是有区别,区别如下:共同点:都可以对interface{} /any类型的数据进行数据类型的断言区别:  类型断言x.(T)......
  • Docker安装MySQL详解(mysql5.7)
    一、准备工作1.打开目录cd/usr/local/docker/2.创建文件夹mkdirmysql3.打开文件夹cdmysql/二、创建挂载目录1.创建数据挂载目录mkdirdata2.创建配置文件目录mkdirconfig3.打开configcdconfig/4.编写配置文件vimmy.cnf粘贴配置[client]#端口号po......
  • Java泛型机制详解
    引入泛型的原因泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。引入泛型的意义......
  • (十八)Flink CEP 详解
    目录FlinkCEP引用模式API单个模式组合模式模式组匹配后跳过策略检测模式从模式中选取CEP库中的时间实用案例FlinkCEP是在Flink上层实现的复杂事件处理库。它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的部分。FlinkCEP主要用于实......