Databricks 第9篇:Spark SQL 基礎(數據類型、NULL語義)

Spark SQL 支持多種數據類型,併兼容Python、Scala等語言的數據類型。sql

一,Spark SQL支持的數據類型

整數系列:函數

  • BYTE, TINYINT:表示1B的有符號整數
  • SHORT, SMALLINT:表示2B的有符號整數
  • INT, INTEGER:表示4B的有符號整數
  • LONG, BIGINT:表示8B的有符號整數

小數系列:spa

  • FLOAT, REAL:表示4B的單精度浮點數
  • DOUBLE:表示8B的雙精度浮點數
  • DECIMAL, DEC, NUMERIC:表示任意精度的帶符號十進制數字,精確數

日期和時間類型:unix

  • DATE:表示日期
  • TIMESTAMP:表示日期和時間
  • INTERVAL:表示Calendar Interval

其餘類型:code

  • STRING:文本類型
  • BINARY:字節序列
  • BOOLEAN:布爾值

複合類型:orm

  • ARRAY<element_type>
  • STRUCT<field1_name: field1_type, field2_name: field2_type, …>
  • MAP<key_type, value_type>

二,Spark SQL支持的數據類型和pyspark.sql.types 之間的映射關係

  • datetime.datetime 對應 TIMESTAMP
  • datetime.date 對應 DATE
  • list, tuple, array 對應 ARRAY<element_type> 和 STRUCT<field1_name: field1_type, field2_name: field2_type, …>
  • dict 對應MAP<key_type, value_type>
  • int 或 long 對應整數
  • float 對應浮點小數
  • decimal.Decimal 對應 精確數
  • bool 對應 布爾值
  • bytearray 對應 BINARY
  • string 對應 文本類型

三,Spark SQL的Date和Timestamp函數

Spark SQL一般使用字符串來表示Date和Timestamp類型的值,字符串要跟Date和Timestamp相互轉換,在轉換時,能夠設置格式參數fmt,按照特定的格式來相互轉換。blog

fmt是格式字符串,由相應的模式來指定格式:ci

  • dd:以兩位數字顯示月份中的天數
  • MM:以兩位數字顯示月份
  • yyyy:以4位數字顯示年份
  • HH:以2位數字顯示24小時制
  • ss:以2位數字顯示秒數
  • S:小數秒

1,表示Date或timestampelement

方法1:用字符串轉換爲Date或timestamp文檔

date '1970-1-03'
timestamp '1970-1-03 04:05:06.78'

方法2:把字符串按照特定的格式轉換爲Date或timestamp

to_date(date_str[,fmt])
to_timestamp(timestamp_str[,fmt])

方法2:用數字構造Date或timestamp

make_date(year,month,day)
make_timestamp(year,month,day,hour,min,sec[,timezone])

2,把Date和timestamp轉換爲string

date_format(timestamp,fmt)

舉個例子,把Date和timestamp按照特定的格式轉換位字符串:

select date_format(date '1970-1-03', "yyyy-MM-dd");
--1970-01-03
select date_format(timestamp '1970-1-03 04:05:06.78', "yyyy-MM-dd HH:mm:ss.SS");
--1970-01-03 04:05:06.78

3,當前的Date和Timestamp

current_date()
current_timestamp()
now()  -- current timestamp

4,提取Date和Timestamp的成分

field:是指year、month、day、hour、minute、second,

source:是指Date或Timestamp

date_part(field,source)

year(date)
month(date)
day(date)
hour(timestamp)
minute(timestamp)
second(timestamp)

5,unixtimestamp

unix timestamp是用數字來表示timestamp

unix_timestamp([timeExp[format]])

from_unixtime(unix_time,format)
to_unix_timestamp(timeExp[,format])

6,Date和Timestamp操做

以day或month爲單位來對Date和Timestamp進行操做:

add_months(start_date,num_months)
months_between(timestamp1,timestamp2[,roundOff])

date_add(start_date,num_days)
date_sub(start_date,num_days)
datediff(endDate,startDate)

截斷到特定的時間成分:

-- truncate timestamp
date_trunc(fmt,ts)

-- truncate date
trunc(date,fmt)

7,UTC時間

from_utc_timestamp(timestamp,timezone)
to_utc_timestamp(timestamp,timezone)

四,文本(literal)

文本常量是指用文本表示一個固定不變的量,

1,16進制的字節序列

X { 'num [ ... ]' | "num [ ... ]" }

2,Date 和 Timestamp Literal

DATE  'yyyy-[m]m-[d]d[T]' 
TIMESTAMP  'yyyy-[m]m-[d]d[T][h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]'

五,NULL語義

Spark SQL也支持三值邏輯,任何兩個值比較的結果是:True、False和Unknown,NULL表明Unknown(未知值)。

1,比較運算

NULL和任何值(包括NULL)進行比較,返回的都是NULL,爲了比較NULL值,Spark提供了一個null-safe的「等於運算符」 <=>,該運算符的運算邏輯是:

NULL <=> NULL,返回True

NULL <=> 任意非NULL, 返回False

2,邏輯運算符

Spark支持的邏輯運算符是AND, OR和 NOT

NOT NULL 返回NULL

NULL AND false 返回false,NULL AND true, NULL AND NULL都返回NULL

NULL OR true 返回true, NULL OR NULL,NULL OR false 都返回 NULL

3,判斷NULL值的函數

ISNULL(null) 返回true 

ISNAN(null) 返回false

 

參考文檔:

SQL reference for Databricks Runtime 7.x

NULL semantics

相關文章
相關標籤/搜索