spark sql语法

2022-04-11 00:00:00 函数 返回 类型 转换 字句


Spark SQL也可以通过设置参数来使其符合ANSI标准(结构化查询语言(SQL)是用于访问和管理数据库的数据库管理员(DBA)的标准语言),通过设置spark.sql.ansi.enabled=’true’(默认值是false)选项来控制spark sql是否符合ANSI标准,当spark.sql.storeAssignmentPolicy(默认值为ANSI)选项为ANSI时,spark sql符合ANSI标准的存储分配原则,这两个配置选项是相互独立的。

01

基本语法


1.1 算数运算
spark sql进行算数运算时不会检查长度溢出,例如:
结果为:
1.2 类型转换
Spark sql有三种类型转换,显示转换、强制类型转换和存储分配转换。
当设置spark.sql.ansi.enabled=true时,非法的类型转换就会抛出运行时异常;
当设置spark.sql.storeAssigmentPolicy=”ANSI”时,insert into语法抛出语义分析异常。
ANSI标准不允许以下直接的类型转换,NumbericType <=> BooleanType;StringType<=>BinaryType。
下表给出了强制类型转换中的组合,Y表示组合有效,N表示。
1.3 NULL值处理
1)比较运算符
Spark sql支持标准的比较操作符,例如“>”、“>=”、“=”、“<”和“<=”,当其中一个操作数unknow或NULL时,结果就为unknow或NULL,为了比较空值是否相等,spark提供了操作符“<=>”,当一个操作数为unknow或NULL时返回false,当两个操作数都为unknow或NULL时,返回值为true。
例如:
2)逻辑判断操作符
逻辑判断操作符有and、or和not,参数为逻辑表达式,返回值为Boolean类型。
例如:
一些Spark sql函数参数为NULL,则返回结果也为NULL,例如:
还有一些可以处理NULL值得函数,例如:
3)聚合函数对于NULL值得处理
聚合函数有MAX、MIN、AVG、SUM、EVERY、ANY、SOME。
  • COUNT(*)返回的所有的数据个数
  • COUNT(NAME)返回的是NAME不为NULL的个数。
  • 其他聚合函数都为将NULL排除再进行操作。
  • WHERE、HAVING、JOIN字句中NULL值得处理。
  • WHERE字句中将会排除过滤条件为NULL的数据。
  • WHERE NAME IS NULL将会返回NAME为NULL的数据。
  • HAVING字句将会将为NULL的数据过滤掉。
  • JOIN字句中将会将为NULL值得数据过滤掉,但是如果使用<=>作为关联条件时将会一块将NULL进行返回。意思就是两边关联条件如果都为NULL也是可以返回的。
  • GROUP BY、DISTINCT对NULL值都会进行处理,不会排除为NULL值得数据。
  • ORDER BY字句也会将NULL进行排序,默认情况下,NULL值得数据都会排在前面,如果想排在后可以:ORDER BY AGE NULLS  LAST进行处理。
  • EXISTS和NOT EXISTS字句中,也不会将NULL值进行排除。

02

函  数


内置函数见:https://spark.apache.org/docs/latest/api/sql/,里面包括了各种字符串,日期,转换等非常有用的内置函数。
自定义函数(UDF)
当内置函数不能满足需求时也可以自己定义函数,使用方法如下:
1)首先定义函数:
例如该函数作用于字符串类型,按照“,”进行切割,然后返回一个元组,然后注册函数:
2)后是使用函数:

03

数据类型


Spark sql和dataFrame支持以下数据类型:
1)数字类型
ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、DecimalType、BigDecimal 。
2)字符串类型
StringType、VarcharType(StringType 类型变体,有长度限制)、CharType(VarcharType类型变体,固定长度)。
3)二进制类型
BinaryType
4)Boolean类型
BooleanType
5)时间类型
TimestampType(到秒)、DateType(到天)
6)复杂类型
  • ArrayType(elementType, containsNull):表示元素序列数据类型,containsNull用于指示是否可以包括空值。
  • MapType(keyType, valueType, valueContainsNull)用于表示键值对数据类型,其中key不能为空值,valueContainsNull指示值是否可以为空。
  • StructType(fields):一系列由StructField(name, dataType, nullable)定义的数据类型,nullable指示是否可以为空。
通过import org.apache.spark.sql.*._ 来使用这些数据类型。
例如:

相关文章