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| 20|15552211521|
|hong| 19|13287994007|
| zhi| 21|15552211523|
+----+---+-----------+

以编程的方式使用内置函数

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| 20|15552211521|Ming-9b87d4d5-91d...|
|hong| 19|13287994007|hong-7a91f7d8-66a...|
| zhi| 21|15552211523|zhi-f005859c-4516...|
+----+---+-----------+--------------------+

同样,我们可以将我们自定义的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", 20, 15552211521L), ("hong", 19, 13287994007L), ("zhi", 21, 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|
      * +--------------------+----+---+-----------+
      */
  }
}

原文地址:https://www.cnblogs.com/itboys/p/9818708.html

时间: 2024-08-03 23:42:34

Spark SQL内置函数的相关文章

sql内置函数pivot强大的行转列功能

原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 200

SQL内置函数细讲

一.伪表.系统内置的只有一行一列数据的表.常用来执行函数. select 函数名 from dual 注:以下所有函数为了方便理解均用 伪表 做为事例! 二. 时间函数 1.sysdate:获取数据库系统的当前时间 例:select sysdate from dual 我们就会获取到当前系统的时间 2.add_months:对日期的月份进行加减 select add_months(日期, 数值) from dual 在这里的数值是必须要写的,如果不想对日期进行加减我们可以把数值写成0! 例:se

Oracle SQL 内置函数大全(转)

SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A         A      ZERO     SPACE--------- --------- --------- ---------65        97        48        32 2.CHR 给出整数,返回对应的字符;SQL> selec

SQL内置函数

一.字符型函数(只是记录一些容易忘记的基本函数) 1.大小写转换函数 INITCAP:将字符串中每一个单词的第一个字母转换为大写,其他均为小写 SELECT INITCAP(column) FROM DUAL2.字符串处理函数 INSTR:从一个字符串中查找一个给定字符的数字位置 SELECT INSTR(String,'K') FROM DUAL LPAD:用给定的字符从左填充字符串到给定的长度 RPAD:用给定的字符从又填充字符串到给定的长度 3.字符串替代函数 REPLACE(string

spark2.3 SQL内置函数——Date window functions

1. def cume_dist(): Column –CUME_DIST 小于等于当前值的行数/分组内总行数–比如,统计小于等于当前薪水的人数,所占总人数的比例 d1,user1,1000 d1,user2,2000 d1,user3,3000 d2,user4,4000 d2,user5,5000 df.withColumn("rn1",cume_dist().over(Window.partitionBy(col("dept")).orderBy(col(&q

SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.Zuowenjun.cn) --CreateDate:2015-06-02 --Function:分页获取数据 /******************/ crea

数据存储——SQLite数据库存储——SQL语句——DML数据操作语言、内置函数聚合函数

一.连接查询之内连接 select   a.字段,b.字段   from   表1   a,表2   b    where   a.字段=b.字段  And ... 二.DML 数据操作语言 1.增  insert  into values 1-insert  into 表名  values (跟所有字段一一对应的值的列表) 2-insert  into 表名(字段列表)  values (跟字段列表一一对应的值的列表) 3-insert  into 表名  select  对应的字段列表  f

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串__pattern :进行匹配的正则表达式,匹配的值将返回,返回策略由__occurrence决定__po

使用内置函数操作数据库

0.视频:http://www.imooc.com/video/3383 1.笔记: ContentValues: 1)用于存储一组可以被ContentResolve处理的值: 2)代码示例: ContentValues values=new ContentValues();//类似hashMap key value values.put("name", "张三"); 3)执行对应的Sql操作: db.update("stutb", values