Spark SQL----数据类型

Spark SQL----数据类型

  • 一、支持的数据类型
  • 二、浮点特殊值
  • 三、正负无穷语义
  • 四、NaN语义
  • 五、例子

一、支持的数据类型

Spark SQL和DataFrames支持以下数据类型:

  • Numeric类型
    • ByteType:表示1字节的带符号整数。数字的范围从-128到127。
    • ShortType:表示2字节有符号整数。数字的范围从-32768到32767。
    • IntegerType:表示4字节有符号整数。数字范围为-2147483648到2147483647。
    • LongType:表示8字节有符号整数。数字范围从9223372036854775808到9223372036864775807。
    • FloatType:表示4字节的单精度浮点数。
    • DoubleType:表示8字节双精度浮点数。
    • DecimalType:表示任意精度的带符号十进制数。内部由java.math.BigDecimal支持。BigDecimal由一个任意精度的integer unscaled值和一个32-bit integer scale组成。
  • String类型
    • StringType:表示字符串值。
    • VarcharType(length):StringType的一个变体,有长度限制。如果输入字符串超过长度限制,数据写入将失败。注意:此类型只能在表schema中使用,不能在函数/运算符中使用。
    • CharType(length):VarcharType(length)的一种变体,是固定长度。读取CharType(n)类型的列总是返回长度为n的字符串值。Char type列比较将把短的列填充到较长长度。
  • Binary 类型
    • BinaryType:表示字节序列值。
  • Boolean 类型
    • BooleanType:表示布尔值。
  • Datetime类型
    • DateType:表示由字段年、月和日的值组成的值,不带时区。
    • TimestampType:带有本地时区的时间戳(TIMESTAMP_LTZ)。它表示由年、月、天、小时、分钟和秒字段值组成的值,以及会话本地时区。时间戳值表示一个绝对时间点。
    • TimestampNTZType:不带时区的时间戳(TIMESTAMP_NTZ)。它表示由年、月、日、小时、分钟和秒字段值组成的值。所有操作都是在不考虑任何时区的情况下执行的。
      • 注意:Spark中的TIMESTAMP是用户指定的别名,与TIMESTAMP_LTZ和TIMESTAMP_NTZ变体之一关联。用户可以通过配置spark.sql.timestampType将默认时间戳类型设置为 TIMESTAMP_LTZ(默认值)或TIMESTAMP_NTZ。
  • Interval类型
    • YearMonthIntervalType(startField,endField):表示由以下字段的连续子集组成的year-month间隔:
      • MONTH,年内的月份[0…11],
      • YEAR,年份在[0…178956970]范围内。
        单个interval字段是非负的,但interval本身可以有符号,并且是负的。
        startField是该类型最左边的字段,endField是最右边的字段。startField和endField的有效值分别为0(MONTH)和1(YEAR)。支持的year-month interval 类型有:
Year-Month Interval TypeSQL typeAn instance of the type
YearMonthIntervalType(YEAR, YEAR) or YearMonthIntervalType(YEAR)INTERVAL YEARINTERVAL ‘2021’ YEAR
YearMonthIntervalType(YEAR, MONTH)INTERVAL YEAR TO MONTHINTERVAL ‘2021-07’ YEAR TO MONTH
YearMonthIntervalType(MONTH, MONTH) or YearMonthIntervalType(MONTH)INTERVAL MONTHINTERVAL ‘10’ MONTH
  • DayTimeIntervalType(startField,endField):表示由以下字段的连续子集组成的一天时间interval:
    • SECOND,几分钟内的秒,可能是一秒的几分之一[0…59.999999],
    • MINUTE,小时内的分钟[0…59],
    • HOUR,天内小时[0…23],
    • DAY,在[0…106751991]范围内的天。
      单个interval字段是非负的,但interval本身可以有符号,并且是负的。
      startField是该类型最左边的字段,endField是最右边的字段。startField和endField的有效值分别为0 (DAY), 1 (HOUR), 2 (MINUTE), 3 (SECOND)。支持的day-time interval类型包括:
Day-Time Interval TypeSQL typeAn instance of the type
DayTimeIntervalType(DAY, DAY) or DayTimeIntervalType(DAY)INTERVAL DAYINTERVAL ‘100’ DAY
DayTimeIntervalType(DAY, HOUR)INTERVAL DAY TO HOURINTERVAL ‘100 10’ DAY TO HOUR
DayTimeIntervalType(DAY, MINUTE)INTERVAL DAY TO MINUTEINTERVAL ‘100 10:30’ DAY TO MINUTE
DayTimeIntervalType(DAY, SECOND)INTERVAL DAY TO SECONDINTERVAL ‘100 10:30:40.999999’ DAY TO SECOND
DayTimeIntervalType(HOUR, HOUR) or DayTimeIntervalType(HOUR)INTERVAL HOURINTERVAL ‘123’ HOUR
DayTimeIntervalType(HOUR, MINUTE)INTERVAL HOUR TO MINUTEINTERVAL ‘123:10’ HOUR TO MINUTE
DayTimeIntervalType(HOUR, SECOND)INTERVAL HOUR TO SECONDINTERVAL ‘123:10:59’ HOUR TO SECOND
DayTimeIntervalType(MINUTE, MINUTE) or DayTimeIntervalType(MINUTE)INTERVAL MINUTEINTERVAL ‘1000’ MINUTE
DayTimeIntervalType(MINUTE, SECOND)INTERVAL MINUTE TO SECONDINTERVAL ‘1000:01.001’ MINUTE TO SECOND
DayTimeIntervalType(SECOND, SECOND) or DayTimeIntervalType(SECOND)INTERVAL SECONDINTERVAL ‘1000.000001’ SECOND
  • Complex 类型
    • ArrayType(elementType,containsNull):表示包含elementType类型的元素序列的值。containsNull用于指示ArrayType值中的元素是否可以具有null值。
    • MapType(keyType,valueType,valueContainsNull):表示包含一组键值对的值。键的数据类型由keyType描述,值的数据类型则由valueType描述。对于MapType值,键不允许具有null值。valueContainsNull用于指示MapType值的值是否可以具有null值。
    • StructType(fields):表示具有由StructFields(fields)序列描述的结构的值。
      • StructField(name,dataType,nullable):表示StructType中的字段。字段的名称由name表示。字段的数据类型由dataType表示。nullable用于指示这些字段的值是否可以具有null值。

Spark SQL的所有数据类型都位于pyspark.sql.types包中。你可以通过以下方式访问它们

from pyspark.sql.types import *
Data typeValue type in PythonAPI to access or create a data type
ByteTypeint或long
注意:数字将在运行时转换为1字节的有符号整数。请确保数字在-128到127的范围内。
ByteType()
ShortTypeint或long
注意:数字将在运行时转换为2字节的有符号整数。请确保数字在-32768到32767的范围内。
ShortType()
IntegerTypeint or longIntegerType()
LongTypelong
注意:数字将在运行时转换为8字节的有符号整数。请确保数字在-9223372036854775808到9223372036854775807的范围内。否则,请将数据转换为decimal.Decimal并使用DecimalType。
longtype ()
FloatTypefloat
注意:数字将在运行时转换为4字节的单精度浮点数。
FloatType()
DoubleTypefloatDoubleType()
DecimalTypedecimal.DecimalDecimalType()
StringTypestringStringType()
BinaryTypebytearrayBinaryType()
BooleanTypeboolBooleanType()
TimestampTypedatetime.datetimeTimestampType()
TimestampNTZTypedatetime.datetimeTimestampNTZType()
DateTypedatetime.dateDateType()
DayTimeIntervalTypedatetime.timedeltaDayTimeIntervalType()
ArrayTypelist, tuple, or arrayArrayType(elementType, [containsNull])
注意:containsNull默认值为True。
MapTypedictMapType(keyType, valueType, [valueContainsNull])
注意valueContainsNull默认值为True.
StructTypelist or tupleStructType(fields)
注意:fields是StructFields的一个序列。另外,不允许有两个名称相同的字段。
StructField该字段的数据类型在Python中的值类型
(例如,对于数据类型为IntegerType的StructField,为Int)
StructField(name, dataType, [nullable])
注意:nullable默认值为True。

二、浮点特殊值

Spark SQL以不区分大小写的方式支持几种特殊的浮点值:

  • Inf/+Inf/Infinity/+Infinity:正无穷大
    - FloatType:相当于Scala Float.PositiveInfinity。
    - DoubleType:相当于Scala Double.PositiveInfinity。
  • -Inf/-Infinity:负无穷大
    - FloatType:相当于Scala Float.NegativeInfinity。
    - DoubleType:相当于Scala Double.NegativeInfinity。
  • NaN:不是数字
    - FloatType:相当于Scala Float.NaN。
    - DoubleType:相当于Scala Double.NaN。

三、正负无穷语义

对正无穷大和负无穷大有特殊处理。它们具有以下语义:

  • 正无穷大乘以任何正值都会返回正无穷大。
  • 负无穷大乘以任何正值返回负无穷大。
  • 正无穷大乘以任何负值都会返回负无穷大。
  • 负无穷大乘以任何负值都会返回正无穷大。
  • 正/负无穷大乘以0返回NaN。
  • 正/负无穷大等于它本身。
  • 在聚合中,所有正无穷大值都被分组在一起。类似地,所有负无穷大值都被分组在一起。
  • 正无穷大和负无穷大被视为join keys中的正常值。
  • 正无穷大排序低于NaN,高于任何其他值。
  • 负无穷大排序低于任何其他值。

四、NaN语义

在处理与标准浮点语义不完全匹配的float或double类型时,会对非数字(NaN)进行特殊处理。具体来说:

  • NaN = NaN返回true。
  • 在聚合中,所有NaN值被分组在一起。
  • NaN在join keys中被视为正常值。
  • NaN值按升序排在最后,比任何其他数值都大。

五、例子

SELECT double('infinity') AS col;
+--------+
|     col|
+--------+
|Infinity|
+--------+SELECT float('-inf') AS col;
+---------+
|      col|
+---------+
|-Infinity|
+---------+SELECT float('NaN') AS col;
+---+
|col|
+---+
|NaN|
+---+SELECT double('infinity') * 0 AS col;
+---+
|col|
+---+
|NaN|
+---+SELECT double('-infinity') * (-1234567) AS col;
+--------+
|     col|
+--------+
|Infinity|
+--------+SELECT double('infinity') < double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+SELECT double('NaN') = double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+SELECT double('inf') = double('infinity') AS col;
+----+
| col|
+----+
|true|
+----+CREATE TABLE test (c1 int, c2 double);
INSERT INTO test VALUES (1, double('infinity'));
INSERT INTO test VALUES (2, double('infinity'));
INSERT INTO test VALUES (3, double('inf'));
INSERT INTO test VALUES (4, double('-inf'));
INSERT INTO test VALUES (5, double('NaN'));
INSERT INTO test VALUES (6, double('NaN'));
INSERT INTO test VALUES (7, double('-infinity'));
SELECT COUNT(*), c2 FROM test GROUP BY c2;
+---------+---------+
| count(1)|       c2|
+---------+---------+
|        2|      NaN|
|        2|-Infinity|
|        3| Infinity|
+---------+---------+

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

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

相关文章

【C++ OpenCV】机器视觉-二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算

原图 结果图 //包含头文件 #include <opencv2/opencv.hpp>//命名空间 using namespace cv; using namespace std;//全局函数声明部分//我的腐蚀运算 Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0) {uint32_t x 0, y 0;Mat dst(src.rows, src.cols, CV_8U…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码&#xff0c;还是只是需要将设备恢复到出厂设置&#xff0c;我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法&#xff0c;轻松重新控制您的 Rea…

Hadoop3:集群压测-读写性能压测

一、准备工作 首先&#xff0c;我们要知道&#xff0c;平常所说的网速和文件大小的MB是什么关系。 100Mbps单位是bit&#xff1b;10M/s单位是byte ; 1byte8bit&#xff0c;100Mbps/812.5M/s。 测试 配置102、103、104虚拟机网速 102上用Python开启一个文件下载服务&#x…

Alpha2:使用深度强化学习挖掘公式化的超额收益因子(附论文及源代码)

原创文章第577篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 今天说说因子挖掘&#xff0c;我们之前交付的Deap遗传算法因子挖掘&#xff0c;大家可以前往温习一下&#xff1a; 源码发布Quantlab4.2&#xff0c;Deap因子挖掘|gplearn做不到的…

【编译】strip去除符号表

文章目录 1. 去除符号表2. dbg信息的作用2.1 静态编译2.2 动态库编译方式 1. 去除符号表 作用&#xff1a;去除符号表可以极大缩小发布的二进制大小&#xff08;有时候可以缩小一半&#xff09; 去除手段共两种&#xff1a; 直接使用strip命令使用objcopy(更常用&#xff09;…

多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步和并发问题。

多线程编程在现代计算机系统中非常重要&#xff0c;因为它能够使程序同时执行多个操作&#xff0c;提高计算效率。以下是多线程编程的基本概念及如何在C标准库中使用std::thread和std::async进行多线程编程&#xff0c;同时处理线程同步和并发问题。 多线程编程的基本概念 线程…

K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

前言 Redis 是在开发过程中经常用到的缓存中间件&#xff0c;为了考虑在生产环境中稳定性和高可用&#xff0c;Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略时&#xff0c;常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点&#xff0c;相较之下&#…

十款绚丽的前端 CSS 菜单导航动画

CSS汉堡菜单是一种非常流行的PC端和移动端web菜单风格&#xff0c;特别是移动端&#xff0c;这种风格的菜单应用更为广泛。这款菜单便非常适合在手机App上使用&#xff0c;它的特点是当顶部菜单弹出时&#xff0c;页面内容将会配合菜单出现适当的联动&#xff0c;让整个页面变得…

关于linux捕捉鼠标事件的方法

网上找了很多方法&#xff0c;都比较杂乱。这篇文章专注于读取鼠标的动作&#xff1a;左键、右键、中键、滚轮。 linux的设备都以文件形式存放&#xff0c;要读取鼠标&#xff0c;有两种方法&#xff0c;一种是通过/dev/input/mice&#xff0c;一种是通过/dev/input/eventx (x…

探索线程安全:HashMap 的四种使用技巧

这篇文章&#xff0c;我们聊聊线程安全使用 HashMap 的四种技巧。 1 方法内部&#xff1a;每个线程使用单独的 HashMap 如下图&#xff0c;tomcat 接收到到请求后&#xff0c;依次调用控制器 Controller、服务层 Service 、数据库访问层的相关方法。 每次访问服务层方法 serv…

vue H5页面video 视频流自动播放, 解决ios不能自动播放问题

视频组件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自动播放muted //是否静音playsinline"true"x5-playsinline""webkit-playsinline"tru…

[Linux安全运维] Linux用户以及权限管理

Linux用户以及权限管理 Linux用户和组 用户信息文件pasawd /etc/passwd文件用于存储用户的信息 :用于分割不同的字段信息 字段示例&#xff08;第一行&#xff09;含义说明1root用户名2x密码占位符x代表用户有密码存储在shadow文件中无内容代表用户登录系统不需要密码30UID…

梧桐数据库:存算分离和存算一体架构的分布式数据库技术分析

摘要&#xff1a; 随着数据量的不断增长和对数据处理性能的要求越来越高&#xff0c;分布式数据库技术成为了数据存储和处理的重要解决方案。存算分离和存算一体是两种常见的分布式数据库架构&#xff0c;它们在数据存储和计算方面有着不同的特点和优势。本文将对存算分离和存算…

Spring源码(一) 如何阅读 Spring 源码

学习 Spring 的源码&#xff0c;也可以通过 SpringBoot 搭环境。 不管是什么源码&#xff0c;最好写个 demo&#xff0c;跑起来&#xff0c;然后从常用的类和方法入手&#xff0c;跟踪调试。 配置对象 新建一个 SpringBoot 的项目&#xff0c; 详情见&#xff1a; https://b…

FreeRTOS 中 vListInsertEnd 函数详解

在 FreeRTOS 中&#xff0c;vListInsertEnd 函数用于将新项插入到指定列表的尾部&#xff08;但实际行为是插入到一个特定的索引位置之前&#xff09;。FreeRTOS 使用双向链表&#xff08;doubly linked list&#xff09;来管理任务和其他系统对象&#xff0c;这样可以高效地插…

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…

JAVA实现二分查找,斐波那契数列,深度优先搜索详情教程【包含代码】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

react+ts+antd项目搭建

前言&#xff1a; 基于ts语言创建react项目&#xff0c;node版本是v16.14.2 一、 脚手架创建项目 全局安装 npm install -g creacte-react-app创建项目file-management&#xff0c;ts需要添加–template typescript npx create-react-app file-management --template typesc…

Ubuntu查看opencv版本c++

✗命令行中直接输入&#xff1a; pkg-config --modversion opencv✔命令行中直接输入&#xff1a; pkg-config --modversion opencv4注解&#xff1a;附上在markdown中打勾&#xff0c;对号和打叉。使用时将&和#之间的空格去掉&#xff0c;这里只是为了不让CSDN自动转换才…

Ubuntu20.04 c++程序 涉及opencv问题记录

头文件更改 默认的头文件引用是 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>但是在ubuntu20中/usr/include中默认的是opencv4&#xff0c;他文件夹里面才是opencv2&#xff0c;需要…