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.pswp.cn/diannao/40344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40344.shtml
英文地址,請注明出處:http://en.pswp.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;需要…