Spark SQL内置函数
Spark SQL内置函数官网API:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions%24
平常在使用mysql的时候,我们在写SQL的时候会使用到MySQL为我们提供的一些内置函数,如数值函数:求绝对值abs()、平方根sqrt()等,还有其它的字符函数、日期函数、聚合函数等等。使我们利用这些内置函数能够快速实现我们的业务逻辑。在SparkSQL里其实也为我们提供了近两百多种内置函数,我们通过
import org.apache.spark.sql.functions._
导入内置函数包,来使用。也可以在SQL语句中直接使用。SparkSQL内置函数分类:聚合函数、集合函数、日期函数、数学函数、混杂函数、非聚合函数、排序函数、字符串函数、UDF函数和窗口函数这10类函数。
1 内置函数的使用
使用内置函数的方式有两种,一种是通过编程的方式的使用,另一种是通过SQL的方式使用。
例如:我们有如下数据,想要使用SparkSQL内置函数lower()来将名字全部转为小写
+----+---+-----------+
|name|age| phone|
+----+---+-----------+
|Ming| ||
|hong| ||
| zhi| ||
+----+---+-----------+
以编程的方式使用内置函数
import org.apache.spark.sql.functions._
df.select(lower(col("name")).as("name"), col("age"), col("phone")).show()
以SQL的方式使用
df.createOrReplaceTempView("people")
spark.sql("select lower(name) as name,age,phone from people").show()
2 UDF函数的使用
有的时候,SparkSQL提供的内置函数无法满足我们的业务的时候,我们可以使用过UDF函数来自定义我们的实现逻辑。例如:需要对上面的数据添加一列id,要求id的生成是name+随机生成的uuid+phone。这时候我们可以使用UDF自定义函数实现。如下所示:
//根据name和phone生成组合,并加上一段uud生成唯一表示id
def idGenerator(name: String, phone: Long): String = {
name + "-" + UUID.randomUUID().toString + "-" + phone.toString
}
//生成udf函数
val idGeneratorUDF = udf(idGenerator _)
//加入隐式转换
import spark.implicits._
df.withColumn("id", idGeneratorUDF($"name", $"phone")).show()
也可以这样写:
//加入隐式转换
import spark.implicits._
//根据name和phone生成组合,并加上一段uud生成唯一表示id
def idGenerator(name: String, phone: Long): String = {
name + "-" + UUID.randomUUID().toString + "-" + phone.toString
}
//注册udf函数
spark.udf.register("idGenerator",idGenerator _)
//使用idGenerator
df.withColumn("id",callUDF("idGenerator",$"name",$"phone")).show()
结果都是一样的:
+----+---+-----------+--------------------+
|name|age| phone| id|
+----+---+-----------+--------------------+
|Ming| ||Ming-9b87d4d5-91d...|
|hong| ||hong-7a91f7d8-66a...|
| zhi| ||zhi-f005859c-...|
+----+---+-----------+--------------------+
同样,我们可以将我们自定义的UDF函数注册到SparkSQL里,然后用SQL实现
//将自定义函数注册到SparkSQL里
spark.udf.register("idGeneratorUDF",idGeneratorUDF)
//创建临时表
df.createOrReplaceTempView("people")
//使用sql查询
spark.sql("select idGeneratorUDF(name,phone) as id,name,age,phone from people").show()
注意:上面加入import spark.implicits._隐式转换是为了方便使用$”列名”来代替col(“列名”)
完整代码:
import java.util.UUID
import org.apache.spark.sql.SparkSession /**
* spark sql 内置函数
*/
object SparkSQLFunctionApp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName(this.getClass.getSimpleName).master("local").getOrCreate()
import org.apache.spark.sql.functions._
//加入隐式转换: 本例子里可以使用toDF方法和$"列名"代替col("列名")
import spark.implicits._
val df = Seq(("Ming", , 15552211521L), ("hong", , 13287994007L), ("zhi", , 15552211523L)).toDF("name", "age", "phone")
df.show() /**
* +----+---+-----------+
* |name|age| phone|
* +----+---+-----------+
* |Ming| 20|15552211521|
* |hong| 19|13287994007|
* | zhi| 21|15552211523|
* +----+---+-----------+
*/
//1 使用内置函数将所有名字都转为小写
//1.1 编程的方式:
df.select(lower($"name").as("name"), $"age", $"phone").show() /**
* +----+---+-----------+
* |name|age| phone|
* +----+---+-----------+
* |ming| 20|15552211521|
* |hong| 19|13287994007|
* | zhi| 21|15552211523|
* +----+---+-----------+
*/
//1.2 SQL的方式
//注册表
df.createOrReplaceTempView("people")
spark.sql("select lower(name) as name,age,phone from people").show() /**
* +----+---+-----------+
* |name|age| phone|
* +----+---+-----------+
* |ming| 20|15552211521|
* |hong| 19|13287994007|
* | zhi| 21|15552211523|
* +----+---+-----------+
*/ //2 UDF函数的使用
//2.1 直接使用
//根据name和phone生成组合,并加上一段uud生成唯一表示id
def idGenerator(name: String, phone: Long): String = {
name + "-" + UUID.randomUUID().toString + "-" + phone.toString
} //生成udf函数
val idGeneratorUDF = udf(idGenerator _)
df.withColumn("id", idGeneratorUDF($"name", $"phone")).show() /**
* +----+---+-----------+--------------------+
* |name|age| phone| id|
* +----+---+-----------+--------------------+
* |Ming| 20|15552211521|Ming-74338e40-548...|
* |hong| 19|13287994007|hong-4f058f2b-9d3...|
* | zhi| 21|15552211523|zhi-f42bea86-a9cf...|
* +----+---+-----------+--------------------+
*/
//将自定义函数注册到SparkSQL里
spark.udf.register("idGeneratorUDF", idGeneratorUDF)
//创建临时表
df.createOrReplaceTempView("people")
//使用sql查询
spark.sql("select idGeneratorUDF(name,phone) as id,name,age,phone from people").show() /**
* +----+---+-----------+--------------------+
* |name|age| phone| id|
* +----+---+-----------+--------------------+
* |Ming| 20|15552211521|Ming-74338e40-548...|
* |hong| 19|13287994007|hong-4f058f2b-9d3...|
* | zhi| 21|15552211523|zhi-f42bea86-a9cf...|
* +----+---+-----------+--------------------+
*/
//2.2 通过callUDF使用
//注册udf函数
spark.udf.register("idGenerator", idGenerator _)
//使用idGenerator
df.withColumn("id", callUDF("idGenerator", $"name", $"phone")).show() /**
* +----+---+-----------+--------------------+
* |name|age| phone| id|
* +----+---+-----------+--------------------+
* |Ming| 20|15552211521|Ming-74338e40-548...|
* |hong| 19|13287994007|hong-4f058f2b-9d3...|
* | zhi| 21|15552211523|zhi-f42bea86-a9cf...|
* +----+---+-----------+--------------------+
*/
//创建临时表
df.createOrReplaceTempView("people")
//使用sql查询
spark.sql("select idGenerator(name,phone) as id,name,age,phone from people").show() /**
* +--------------------+----+---+-----------+
* | id|name|age| phone|
* +--------------------+----+---+-----------+
* |Ming-d4236bac-e21...|Ming| 20|15552211521|
* |hong-bff84c0d-67d...|hong| 19|13287994007|
* |zhi-aa0174b0-c8b3...| zhi| 21|15552211523|
* +--------------------+----+---+-----------+
*/
}
}
Spark SQL内置函数的更多相关文章
- sql内置函数pivot强大的行转列功能
原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...
- [转] Spark sql 内置配置(V2.2)
[From] https://blog.csdn.net/u010990043/article/details/82842995 最近整理了一下spark SQL内置配.加粗配置项是对sparkSQL ...
- 【翻译】Flink Table Api & SQL — 内置函数
本文翻译自官网:Built-In Functions https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/fu ...
- Oracle SQL 内置函数大全
SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...
- Oracle SQL 内置函数大全(转)
SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...
- Orace内置函数大全[转:http://www.cnblogs.com/lfx0692/articles/2395950.html]
NewProgramer Oracle SQL 内置函数大全(转) SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,a ...
- SQL Server 内置函数、临时对象、流程控制
SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
随机推荐
- Orleans学习总结(六)--应用篇
上一篇Orleans学习总结(五)--监控篇,我们这篇来说说我们项目的应用 这是我们项目的结构图 我们分别来说下各个部分 1.Zookeeper作为集群基础,至少开5个,分别在不同的物理机上 ...
- CentOS6.5安装JDK8
上传JDK源码包,我用的jdk-8u144-linux-x64.tar.gz.解压它 tar -zxvf jdk-8u144-linux-x64.tar.gz 更改环境变量 vim /etc/prof ...
- iOS - 身份证判断正则加算法
身份证常识 我国的身份证号分为15位和18位两种.身份证是国民的身份编号,编号是有一定规律的. 居民身份证号码,根据[中华人民共和国国家标准 GB -]中有关公民身份号码的规定,公民身份号码是特征组合 ...
- 转载:mybatis踩坑之——foreach循环嵌套if判断
转载自:作者:超人有点忙链接:https://www.jianshu.com/p/1ee41604b5da來源:简书 今天在修改别人的代码bug时,有一个需求是在做导出excel功能时,mybatis ...
- hdu5157 Harry and magic string【manacher】
Harry and magic string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 体验 ASP.NET Core 中的多语言支持(Localization)
首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOp ...
- 关于tomcat服务器
如果遇到jsp代码反复运行不成功,并且不报错 而且代码也重复检查过,正确无误了 那么 就不要把精力放在代码上了 有可能是服务器的问题 重启下服务器试试 ……不要问我尽经历过什么
- Hive日志(Hive Logging)--hive GettingStarted翻译
Hive uses log4j for logging. By default logs are not emitted to the console by the CLI. The default ...
- URL地址中的#
1.#的涵义 代表网页中的一个位置.井号后面的字符,就是该位置的标识符.比如, http://www.baidu.com/index.html#one 就代表网页index.html的one位置.浏览 ...
- HTTP协议之Transfer-Encoding
HTTP协议中的Transfer-Encoding 浏览器和服务器端支持持久连接 持久连接(Persist Connection) HTTP1.0默认不是持久连接的 HTTP1.1默认是持久连接的 在 ...