SparkSQL日期时间模式详解

news2024/9/27 6:50:00

datatime使用场景

  • CSV/JSON数据源使用模式字符串来解析和格式化日期时间内容。
  • 日期时间函数用于转换StringType类型到DateType或TimestampType类型,反之亦然。例如,unix_timestamp, date_format, to_unix_timestamp, from_unixtime, to_date, to_timestamp, from_utc_timestamp, to_utc_timestamp等。

常用的模式字母

Spark使用下表中的模式字母进行日期和时间戳的解析和格式化:
在这里插入图片描述

在这里插入图片描述

模式字母的数量决定了日期时间的格式:

  • 文本(Text):文本风格基于使用的模式字母数量确定。少于4个模式字母将使用简短文本形式,通常是缩写形式,例如,一周中的星期一可能会输出“Mon”。恰好4个模式字母将使用完整文本形式,通常是完整的描述,例如,一周中的星期一可能会输出“Monday”。5个或更多的字母将会导致失败。

  • 数字(n):这里的n代表这种类型的日期时间模式可以使用的最大字母数量。
    在格式化过程中,如果字母的数量为一个,则值将以最少的位数输出且不会填充;否则,字母的数量作为输出字段的宽度,必要时对值进行零填充。
    在解析过程中,输入字段中期望的确切位数是必需的。

  • 数字/文本:如果模式字母的数量为3个或更多,则使用上述的文本规则。否则,使用上述的数字规则。

  • 小数部分(Fraction):使用一个或多个(最多9个)连续的’S’字符,例如SSSSSS,来解析和格式化秒的小数部分。对于解析,可接受的小数长度可以是[1, 连续的‘S’的数量]。对于格式化,小数长度会通过零填充扩展到连续的‘S’的数量。Spark支持微秒精度的日期时间,具有最多6位有效数字,但可以解析纳秒,超过的部分会被截断。

  • 年份(Year):模式字母的数量决定了在何种字段宽度下使用填充。如果字母数量为两个,则使用缩短的两位数字形式。对于打印,这会输出最右边的两位数字。对于解析,这将使用基准值2000进行解析,结果年份将在2000到2099之间(含)。如果字母数量小于四个(但不是两个),则只有负年份才会输出符号。否则,当没有‘G’存在时,如果超过了填充宽度,则输出符号。7个或更多的字母将会导致失败。

  • 月份(Month):它遵循数字/文本的规则。文本形式依赖于字母——‘M’表示‘标准’形式,而‘L’则是‘独立’形式。这两种形式只在某些语言中不同。例如,在俄语中,‘Июль’是七月的独立形式,而‘Июля’是标准形式。下面是所有支持的模式字母的例子:

    • ‘M’ 或 ‘L’:一年中的月份编号,从1开始。‘M’和‘L’之间没有区别。1至9月在打印时不带填充。

      spark-sql> select date_format(date '1970-01-01', "M");
      1
      spark-sql> select date_format(date '1970-12-01', "L");
      12
      
    • ‘MM’ 或 ‘LL’:一年中的月份编号,从1开始。对于1至9月,会添加零填充。

      这意味着:

      • 当使用 ‘MM’ 时,月份将以两位数字的形式显示,例如,1月将显示为 “01”,10月显示为 “10”。
      • 同样地,当使用 ‘LL’ 时,如果遵循数字规则,也将以两位数字的形式显示月份,尽管 ‘L’ 通常用于表示月份的独立形式,但在这种上下文中,如果它是按照数字规则处理的,那么它也会显示为带有零填充的两位数字。

      因此,无论是 ‘MM’ 还是 ‘LL’,只要它们遵循数字规则,1月至9月的月份都会被格式化为带有前导零的形式。

      spark-sql> select date_format(date '1970-1-01', "LL");
        01
        spark-sql> select date_format(date '1970-09-01', "MM");
        09
      
    • ‘MMM’:标准形式下的简短文本表示。月份模式应该是日期模式的一部分,而不是单独的一个月份,除非在某些语言环境中标准形式和独立形式之间没有区别,比如在英语中。

      这意味着:

      • 当使用 ‘MMM’ 时,月份将以简短的文本形式输出,例如,1月可能会输出为 “Jan”,4月为 “Apr”。
      • 此模式字母组合通常用于日期的上下文中,而不是单独用来表示月份。然而,在像英语这样的语言环境下,标准形式和独立形式相同,因此 ‘MMM’ 可以直接表示月份。

      例如,在英语中,“January”(一月)的标准形式和独立形式都是 “Jan”,而在其他语言中,这两者可能会有所不同。在使用 ‘MMM’ 时,Spark 会根据所设置的语言环境来正确地输出或解析月份的简短文本形式。

      spark-sql> select date_format(date '1970-01-01', "d MMM");
      1 Jan
      spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'dd MMM', 'locale', 'RU'));
      01 янв.
      
    • ‘LLL’:独立形式下的简短文本表示。它应该仅用于格式化/解析月份,而不包含任何其他的日期字段。

      这意味着:

      • 当使用 ‘LLL’ 时,月份将以简短的文本形式输出,例如,1月可能会输出为 “Jan”,4月为 “Apr”,但这是在独立形式下。
      • 该模式字母组合专门用于单独表示月份,而不作为日期的一部分。即,它适用于那些需要单独表示月份而不涉及日期其他部分的场景。

      例如,在英语中,如果需要单独表示一个月份而不涉及到具体的日期,那么可以使用 ‘LLL’ 来输出类似于 “Jan” 这样的简短文本形式。在其他语言环境下,标准形式和独立形式可能会有所不同,‘LLL’ 会根据所设置的语言环境输出正确的独立形式的月份简写。

      spark-sql> select date_format(date '1970-01-01', "LLL");
      Jan
      spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'LLL', 'locale', 'RU'));
      янв.
      
    • ‘MMMM’:标准形式下的完整文本表示。它用于作为日期/时间戳的一部分来解析或格式化月份。

      这意味着:

      • 当使用 ‘MMMM’ 时,月份将以完整的文本形式输出,例如,1月可能会输出为 “January”,4月为 “April”。
      • 该模式字母组合通常用于日期或时间戳的上下文中,而不是单独用来表示月份。它主要用于包含完整月份名称的日期格式。

      例如,在英语中,“January”(一月)将以完整的文本形式出现。在使用 ‘MMMM’ 时,Spark 会根据所设置的语言环境来正确地输出或解析月份的完整文本形式。这对于需要完整月份名称的日期格式非常有用,尤其是在与其他日期组件(如日、年)一起使用时。

      spark-sql> select date_format(date '1970-01-01', "d MMMM");
      1 January
      spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'd MMMM', 'locale', 'RU'));
      1 января
      
    • ‘LLLL’:独立形式下的完整文本表示。该模式可以仅用于格式化/解析月份。

      这意味着:

      • 当使用 ‘LLLL’ 时,月份将以完整的文本形式输出,例如,1月可能会输出为 “January”,4月为 “April”,但这是在独立形式下。
      • 该模式字母组合专门用于单独表示月份,而不作为日期的一部分。即,它适用于那些需要单独表示月份而不涉及日期其他部分的场景。

      例如,在英语中,如果需要单独表示一个月份而不涉及到具体的日期,那么可以使用 ‘LLLL’ 来输出类似于 “January” 这样的完整文本形式。在其他语言环境下,标准形式和独立形式可能会有所不同,‘LLLL’ 会根据所设置的语言环境输出正确的独立形式的月份全称。

      spark-sql> select date_format(date '1970-01-01', "LLLL");
      January
      spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'LLLL', 'locale', 'RU'));
      январь
      
  • am-pm:这会输出一天中的上午或下午。模式字母的数量必须是1。

    这意味着:

    • 使用单个字母 ‘a’ 作为模式字母时,将输出一天中的上午(AM)或下午(PM)。
    • 例如,如果时间是上午10点,它将输出 “AM”;如果是下午2点,则会输出 “PM”。
    • 模式字母的数量只能是一个,即 ‘a’,不能是多个,否则将不符合规范。

    在Spark中,使用 ‘a’ 作为模式字母可以帮助在解析和格式化时间时正确地表示12小时制的时间系统中的上午或下午。

  • Zone ID (V):这会输出时区ID。模式字母的数量必须是2。

    这意味着:

    • 使用两个字母 ‘VV’ 作为模式字母时,将输出时区的标识符,例如 “PST”(太平洋标准时间)、“CET”(中部欧洲时间)等。
    • 模式字母的数量必须是2,即 ‘VV’,不能是其他数量,否则将不符合规范。

    在Spark中,使用 ‘VV’ 作为模式字母可以帮助在解析和格式化时间时正确地表示时间所在的时区。这在处理跨时区的数据时尤为重要,确保时间信息能够准确反映其对应的时区。

  • 时区名称 (z):这会输出时区ID的文本名称。如果模式字母的数量为1、2或3个,则输出简短名称;如果模式字母的数量为4个,则输出完整名称。5个或更多的字母将导致失败。

    这意味着:

    • 使用1、2或3个 ‘z’ 作为模式字母时,将输出时区的简短名称,例如 “PDT”(太平洋夏令时)、“CET”(中部欧洲时间)等。
    • 如果使用4个 ‘z’ 作为模式字母,则输出时区的完整名称,例如 “America/Los_Angeles”。
    • 模式字母的数量不能是5个或更多,否则将不符合规范。

    在Spark中,使用不同的 ‘z’ 字母数量可以帮助在解析和格式化时间时正确地表示时区的简短名称或完整名称。这对于需要精确表示数据所在时区的应用场景非常重要。

  • 偏移量 (X 和 x):这会根据模式字母的数量来格式化偏移量。具体如下:

    • 一个字母 ‘X’ 或 ‘x’ 输出仅小时部分,例如 ‘+01’。但如果分钟部分非零,则也会输出分钟部分,例如 ‘+0130’。
    • 两个字母 ‘XX’ 或 ‘xx’ 输出小时和分钟,不带冒号,例如 ‘+0130’。
    • 三个字母 ‘XXX’ 或 ‘xxx’ 输出小时和分钟,带冒号,例如 ‘+01:30’。
    • 四个字母 ‘XXXX’ 或 ‘xxxx’ 输出小时、分钟以及可选的秒,不带冒号,例如 ‘+013015’。
    • 五个字母 ‘XXXXX’ 或 ‘xxxxx’ 输出小时、分钟以及可选的秒,带冒号,例如 ‘+01:30:15’。
    • 六个或更多的字母会导致失败。

    另外,模式字母 ‘X’(大写)当输出的偏移量为零时会输出 ‘Z’,而模式字母 ‘x’(小写)当输出的偏移量为零时会分别输出 ‘+00’, ‘+0000’, 或 ‘+00:00’,具体取决于使用的字母数量。

    这意味着:

    • ‘X’ 和 ‘x’ 都可以根据不同的字母数量来表示不同的偏移格式。
    • ‘X’ 特别之处在于当偏移量为零时会输出 ‘Z’,这在UTC时间(协调世界时)中常见。
    • ‘x’ 在偏移量为零时会输出不同的形式,具体取决于使用的字母数量。
  • 偏移量 (O):这会根据模式字母的数量来格式化本地化的偏移量。具体如下:

    • 一个字母 ‘O’ 输出本地化偏移量的简短形式,这是一种本地化的偏移量文本,例如 ‘GMT’,小时部分不带前导零,如果分钟和秒非零则输出两位数的分钟和秒,并且带上冒号,例如 ‘GMT+8’。
    • 四个字母 ‘OOOO’ 输出本地化偏移量的完整形式,这是一种本地化的偏移量文本,例如 ‘GMT’,带有两位数的小时和分钟字段,如果秒非零则输出秒字段,并且带上冒号,例如 ‘GMT+08:00’。
    • 除了上述两种情况外,其他数量的字母都将导致失败。

    这意味着:

    • ‘O’ 可以用来表示本地化的时间偏移量,简短形式通常为 ‘GMT’ 加上正负号和小时数,如果分钟或秒非零则也包括这些部分。
    • 完整形式则总是包括 ‘GMT’ 加上两位数的小时和分钟,并且如果秒非零的话也包括秒部分,各个部分之间用冒号分隔。
    • 其他数量的字母将不会被支持,因此使用时需注意模式字母的数量。
  • 偏移量 (Z):这会根据模式字母的数量来格式化偏移量。具体如下:

    • 一个、两个或三个字母 ‘Z’ 输出小时和分钟,不带冒号,例如 ‘+0130’。当偏移量为零时,输出为 ‘+0000’。
    • 四个字母 ‘ZZZZ’ 输出本地化偏移量的完整形式,相当于偏移量 ‘O’ 的四个字母形式。当偏移量为零时,输出为相应的本地化偏移量文本,例如 ‘GMT+0000’。
    • 五个字母 ‘ZZZZZ’ 输出小时、分钟以及可选的秒(如果非零),并且带上冒号,例如 ‘+01:30:15’。当偏移量为零时,输出为 ‘Z’。
    • 六个或更多的字母将导致失败。

    这意味着:

    • ‘Z’ 可以用来表示偏移量的不同形式,从简单的小时和分钟到详细的小时、分钟和秒。
    • 当偏移量为零时,根据字母的数量,输出会有所不同:‘+0000’(1-3个字母)、本地化的零偏移文本(4个字母)、‘Z’(5个字母)。
    • 超过五个字母的情况将不会被支持。
  • 可选部分的开始和结束:使用方括号 [] 来定义一个可选部分,并且可以嵌套。在格式化过程中,即使是在可选部分中的所有有效数据也会被输出。在解析过程中,整个可选部分可以从解析的字符串中缺失。

    这意味着:

    • 格式化:无论数据是否位于可选部分内,所有有效数据都会被输出。
    • 解析:在解析时,如果某个可选部分的内容缺失,解析过程仍然可以继续,因为这部分是可选的。

    例如:

    • 如果你有一个日期时间格式 [yyyy-MM-dd] HH:mm:ss,其中方括号内的部分是可选的。

      • 在格式化时,如果提供了年月日,将会输出完整的日期时间,例如 2024-08-26 10:18:00
      • 在解析时,如果输入字符串缺少日期部分,如 10:18:00,解析仍然可以成功,忽略方括号内的缺失部分。
    • 方括号可以嵌套,例如 [[MM/dd/yyyy]] HH:mm:ss,这样内外两层都可以是可选的。

    使用方括号定义可选部分在处理不确定是否存在的数据部分时非常有用,特别是在解析不完全符合预期格式的数据时。

  • 符号 ‘E’、‘F’、‘q’ 和 ‘Q’ 只能用于日期时间的格式化,例如在 date_format 函数中。它们不允许用于日期时间的解析,例如在 to_timestamp 函数中。

    这意味着:

    • 格式化:这些符号可以用来生成特定格式的日期时间字符串。例如,你可以使用这些符号来格式化日期时间,使其符合某种特定的显示需求。
    • 解析:这些符号不能用于将字符串转换为日期时间对象。也就是说,在尝试从字符串中解析日期时间信息时,这些符号是无效的。

    具体来说:

    • ‘E’:表示一周中的某一天,通常用于格式化,如 “Mon” 或 “Monday”。
    • ‘F’:表示一个月中的某一天,通常是一个数字,但不能用于解析。
    • ‘q’:表示一年中的第几个季度,通常用于格式化。
    • ‘Q’:表示一个季度中的某个月,通常用于格式化。

    例如:

    • 如果你使用 date_format 函数,你可以使用这些符号来格式化日期,如 date_format("2024-08-26", "EEEE") 将返回 “Monday”。
    • 但是,如果你试图使用 to_timestamp 函数来解析日期时间字符串,你不能使用这些符号,如 to_timestamp("2024-08-26", "E") 将会抛出错误。

    这些限制是为了确保在解析日期时间字符串时的一致性和准确性,防止因符号使用不当而导致的解析错误。

总结

SparkSQL中的日期时间模式,可能大部分人只了解其中的某部分内容,我们尽可能的把所有的日期模式进行一个全面的了解,这样在使用的时候就能游刃有余。

参考文献

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

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

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

相关文章

SQL AI 工具:颠覆数据库管理与分析的创新力量

一、SQL AI 工具的兴起与发展 在当今数字化的时代,数据量呈现爆炸式增长,企业和个人对于高效管理和分析数据的需求日益迫切。传统的数据库管理和查询方式,对于非技术人员来说存在较高的门槛,操作复杂且耗时。这一背景为 SQL AI 工…

Redis Cluster(无中心化设计)

目录 1 Redis Cluster 的介绍 1.1 Redis Cluster 工作原理 1.2 Redis Cluster特点如下 1.3 Redis cluster 架构 1.4 Redis cluster 主从架构 1.5 Redis Cluster 部署架构说明 1.6 创建redis cluster的前提 2 部署redis cluster 2.1 修改Redis主配置文件参数 2.2 查看端口是否启…

vue 实现简单AI聊天程序(二): python 对接通义千问API

申请账号流程,参考:https://blog.csdn.net/u012917925/article/details/140794192 登录阿里云,然后找到阿里云百炼,创建一个API KEY 配置环境变量:https://help.aliyun.com/zh/model-studio/developer-reference/con…

java直接内存

Java中的内存从广义上可以划分为两个部分,一部分是受JVM管理的堆内存,另一部分则是不受JVM管理的堆外内存,也称为直接内存。直接内存由操作系统来管理,这部分内存的应用可以减少垃圾收集对应用程序的影响。 直接内存概述 直接内…

酒店PMS系统源码之会员系统读取身份证-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、酒店 PMS()会员系统 1. 客户关系管理:帮助酒店有效地管理会员信息,包括个人资料、消费记录、偏好等,从而更好地了解会员需求,提供个性化的服务和优惠。 2. 会员忠诚度提升:通过积分、折扣、…

使用CORS解决跨域问题

CORS(Cross-Origin Resource Sharing)跨域资源共享 因为浏览器的同源策略才出现了跨域问题。 CORS是一套机制,用于浏览器校验跨域请求。 它的基本理念是: 只要服务器明确表示允许,则校验通过服务器明确拒绝或没有表…

读取FTP中不同文件格式的文件流后导出到浏览器

序言 有一个新的需求&#xff0c;前端提供下载的入口&#xff0c;后端能将指定了全路径的各种文件格式的文件下载到浏览器。 对于压缩的zip文件格式需要解析后写入到txt文件格式的文件中&#xff0c;其他的写入原本的文件格式的文件中。 1、连接ftp <!-- jsch-sftp连接…

构建第一个zk

1 必要步骤 视频学习&#xff1a;5. Circcom 中的基本算术电路_哔哩哔哩_bilibili 文字学习&#xff1a;https://hackmd.io/YlNLZS2ESI21OSqdTW_mPw/S1jqN-h80/edit 第五课&#xff0c;circom实践&#xff0c;需要安装 1 vscode 2 rust&#xff1a;Windows安装Rust环境&…

【C++】模拟(例题 学习)

引言 模拟就是用计算机来模拟题目中要求的操作。 模拟题目通常具有码量大、操作多、思路繁复的特点。由于它代码量大&#xff0c;经常会出现难以查错的情况&#xff0c;如果在考试中写错是相当浪费时间的。 注&#xff1a;模拟没有基础思路和模板&#xff0c;所以要多刷题锻…

vscode中文设置(一招解决)

打开vscode 点击这个Estentions图标 搜索Chinese,直接安装,重启就生效了

Jmeter提取token并设置为全局变量

参考文章&#xff1a;Jmeter提取token并设置为全局变量&#xff08;最详细的步骤&#xff09;_jmeter提取token到全局变量-CSDN博客 一般来说&#xff0c;系统内大多数接口&#xff0c;都需要先获取登录后的token值&#xff0c;所以我们需要创建一个获取token的接口&#xff0c…

es相关概念、索引操作(相当于mysql中的数据库操作)

文章目录 1、概念2、索引操作&#xff08;index&#xff09;2.1、查询索引&#xff08;数据库&#xff09;2.2、创建索引&#xff08;数据库&#xff09;2.3、查看单个索引&#xff08;数据库&#xff09;2.4、删除索引&#xff08;数据库&#xff09; 1、概念 RDBMSesMongoDB…

87.游戏改造-UI修正全面分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;86.游戏改造-UI修正暴力分析 首先来到下图位置 一个函数上来就 ECX4 这种不用想直接就看…

羚羊软件:处理sql server 2008 R2 Error 9003

在很多情况下,服务器突然断电或其他原因会造成&#xff0c;数据库附加时出现&#xff1a;错误代码为90003的错误。 解决办法&#xff1a; 1、新建一个同名得数据库&#xff08;Ly_Men_16_2005&#xff09;。 2、停止SQL服务。 3、用原来得主数据库文件&#xff0c;覆盖新建得…

使用在AMD GPU上运行的ROCm进行大语言模型的自然语言处理任务

Performing natural language processing tasks with LLMs on ROCm running on AMD GPUs — ROCm Blogs 在这篇博客中&#xff0c;您将学习如何使用在AMD的Instinct GPU上运行的ROCm进行一系列流行且有用的自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;使用不同的大…

CSS学习笔记(01)flex布局

1、首先对父元素设置disiplay&#xff1a;felx&#xff0c; 其有6个属性 fex-direction:设置主轴的方向 justify-content:设置主轴上的子元素排列方式 flex-wrap:设置子元素是否换行 align-content:设置侧轴上的子元素的排列方式(多行) align-items:设置侧轴上的子元素排列方式…

Debain 安装 MySql

一 Debian安装MySQL 5.7 1 更新安装列表 sudo apt update 2 添加MySql官方APT仓库到Debian wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb先下载再安装源&#xff0c;如下图&#xff1a; 再次执行更新…

从零到一,2024年数据恢复软件新手到专家指南

在数字化的时代&#xff0c;相信你的数据大部分也都是存在一些电子设备里吧。很多时候因为一些意外情况会导致我们数据的丢失&#xff0c;这个时候有什么办法能恢复我们的数据资料呢&#xff1f;这次我们就来一起探讨一些大家都在用的数据恢复工具吧。 1.福昕数据恢复 链接直…

热点 | 爆款游戏的诞生与游戏出海的持续增长

近日&#xff0c;《黑神话&#xff1a;悟空》一经上线就在国内获得了空前的关注。国产大IP3A国际水准带来的超炫视觉体验专业发行与市场营销等&#xff0c;共同引爆了这个现象级的话题。同时&#xff0c;我们也关注到&#xff0c;这款游戏同时在海外多个发行平台进行全球发售。…

Redis 源码安装

目录 1 Redis 的获取 2 Redis 部署 2.1 下载并解压 2.2 Makerfile 文件 2.3 安装所需要编译所需要的包 2.4 开始源码编译 2.5 utils 下的 install_server.sh 脚本文件 2.5 运行脚本进行安装 3 systemd 管理 3.1 编写Redis systemd 服务脚本 3.2 重新加载 systemd 系统 3.3 …