Spark SQL也可以通过设置参数来使其符合ANSI标准(结构化查询语言(SQL)是用于访问和管理数据库的数据库管理员(DBA)的标准语言),通过设置spark.sql.ansi.enabled=’true’(默认值是false)选项来控制spark sql是否符合ANSI标准,当spark.sql.storeAssignmentPolicy(默认值为ANSI)选项为ANSI时,spark sql符合ANSI标准的存储分配原则,这两个配置选项是相互独立的。
spark sql进行算数运算时不会检查长度溢出,例如:Spark sql有三种类型转换,显示转换、强制类型转换和存储分配转换。当设置spark.sql.ansi.enabled=true时,非法的类型转换就会抛出运行时异常;当设置spark.sql.storeAssigmentPolicy=”ANSI”时,insert into语法抛出语义分析异常。ANSI标准不允许以下直接的类型转换,NumbericType <=> BooleanType;StringType<=>BinaryType。下表给出了强制类型转换中的组合,Y表示组合有效,N表示无效。Spark sql支持标准的比较操作符,例如“>”、“>=”、“=”、“<”和“<=”,当其中一个操作数unknow或NULL时,结果就为unknow或NULL,为了比较空值是否相等,spark提供了操作符“<=>”,当一个操作数为unknow或NULL时返回false,当两个操作数都为unknow或NULL时,返回值为true。逻辑判断操作符有and、or和not,参数为逻辑表达式,返回值为Boolean类型。一些Spark sql函数参数为NULL,则返回结果也为NULL,例如:聚合函数有MAX、MIN、AVG、SUM、EVERY、ANY、SOME。- COUNT(NAME)返回的是NAME不为NULL的个数。
- WHERE、HAVING、JOIN字句中NULL值得处理。
- WHERE字句中将会排除过滤条件为NULL的数据。
- WHERE NAME IS NULL将会返回NAME为NULL的数据。
- JOIN字句中将会将为NULL值得数据过滤掉,但是如果使用<=>作为关联条件时将会一块将NULL进行返回。意思就是两边关联条件如果都为NULL也是可以返回的。
- GROUP BY、DISTINCT对NULL值都会进行处理,不会排除为NULL值得数据。
- ORDER BY字句也会将NULL进行排序,默认情况下,NULL值得数据都会排在最前面,如果想排在最后可以:ORDER BY AGE NULLS LAST进行处理。
- EXISTS和NOT EXISTS字句中,也不会将NULL值进行排除。
内置函数见:https://spark.apache.org/docs/latest/api/sql/,里面包括了各种字符串,日期,转换等非常有用的内置函数。当内置函数不能满足需求时也可以自己定义函数,使用方法如下:例如该函数作用于字符串类型,按照“,”进行切割,然后返回一个元组,然后注册函数:
Spark sql和dataFrame支持以下数据类型:ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、DecimalType、BigDecimal 。StringType、VarcharType(StringType 类型变体,有长度限制)、CharType(VarcharType类型变体,固定长度)。TimestampType(到秒)、DateType(到天)- ArrayType(elementType, containsNull):表示元素序列数据类型,containsNull用于指示是否可以包括空值。
- MapType(keyType, valueType, valueContainsNull)用于表示键值对数据类型,其中key不能为空值,valueContainsNull指示值是否可以为空。
- StructType(fields):一系列由StructField(name, dataType, nullable)定义的数据类型,nullable指示是否可以为空。
通过import org.apache.spark.sql.types._ 来使用这些数据类型。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3160759/
,如需转载,请注明出处,否则将追究法律责任。