SparkSQL UDF&&函数

1.SparkSQL自带的Functions

在idea中,双击shift,搜索functions,里面有很多自定义函数



package RDD_DATAFRAME_DATASET

import org.apache.spark.sql.SparkSession

/**
  * SparkSQL函数如何使用
    "2018-01-01,50,1111",
    "2018-01-01,60,2222",
    "2018-01-01,70,3333",
    "2018-01-02,150,1111",
    "2018-01-02,250,1111"

  */
object SalesApp {
  def main(args: Array[String]){
    val spark = SparkSession.builder()
      .appName("SalesApp")
      .master("local[2]")
      .getOrCreate()

    val sales = Array("2018-01-01,50,1111",
    "2018-01-01,60,2222",
    "2018-01-01,70,3333",
    "2018-01-01",
    "2018-01-02,150,1111",
    "2018-01-02,250,1111")

    import spark.implicits._
    val salesDF = spark.sparkContext.parallelize(sales)
      .filter(x => x.split(",").length == 3)
        .map(x => x.split(","))
      .map(x => Sale(x(0),x(1).toInt,x(2)))
      .toDF

    //自带的聚合函数
    import org.apache.spark.sql.functions._
    salesDF.groupBy("data")
        .agg(sum("price").as("money")).show

    spark.stop()
  }
  case class Sale(data:String,price:Int,name:String)
}

2.SparkSQL开发UDF函数

* SparkSQL 开发UDF函数
* 1)定义函数
* 2)注册函数
* 3)使用函数

类似于实现这样一个功能 : strLen(“hello”) ==>5

package RDD_DATAFRAME_DATASET

import org.apache.spark.sql.SparkSession

/**
  * SparkSQL 开发UDF函数
  * 1)定义函数
  * 2)注册函数
  * 3)使用函数
  */
object StrLenUDFApp {
  def main(args: Array[String]){
    val spark = SparkSession.builder()
      .appName("StrLenUDFApp")
      .master("local[2]")
      .getOrCreate()

    import spark.implicits._
    val sales = Array("zhang",
      "wang",
      "li")
    val salesDF = spark.sparkContext.parallelize(sales).toDF("name").createOrReplaceTempView("test")

    //1.定义UDF函数 2.注册UDF函数
    spark.udf.register("strLen",(str:String) => str.length)
    //3.使用UDF函数
    spark.sql("select name,strLen(name) from test").show()

    spark.stop()
  }
}

猜你喜欢

转载自blog.csdn.net/qq_15300683/article/details/80616985