SparkSQL 实现UDF的两种方式

本文探讨了在Spark SQL中创建UDF的两种方法:一种是通过反射推断schema,需要定义样本类;另一种是编程方式,使用StructType和StructField API。了解这些对于掌握Spark程序执行流程和学习Spark ML Pipeline至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.functions._

/**
  
  */
object sparkDataframe {


  def main(args: Array[String]): Unit = {


    val conf = new SparkConf().setMaster("local[*]").setAppName("anti_Join")

    val sqlcontext = new SQLContext(new SparkContext(conf))

    import sqlcontext.implicits._

    val scoreDF = Seq((1, "sk", 99), (2, "jim", 72), (1, "sk", 99)).toDF("id", "name", "score")

    val stuDF = Seq((1, "sk", 99), (2, "jim", 72), (3, "jiem", 82)).toDF("id", "name", "score")

    /*
    * UDF的两种模式
    *
    * 1.sqlcontext注册udf,包含两个变量,静态
    *
    * 2.便动态的UDF
    *
    * */
    sqlcontext.udf.register("nameScore", (name: String, score: String) => {
      name match {
        case name: String if name.startsWith("s") => "China"
        case _ => "USA"
      }
    })

    val nameScores = udf((name: String, score: String) => {
      name match {
        case name: String if name.startsWith("s") => "China"
        case _ => "USA"
      }
    })

    scoreDF.selectExpr("nameScore(name,score) as Country").show()

    scoreDF.select(nameScores($"name",$"score").as("Cout")).show()


  }

}
  1. Spark SQL 程序开发过程中,我们有两种方式确定 schema,第一种是反射推断 schema,如本文的案例二,这种方式下,我们需要定义样本类 (case class) 来对应数据的列;第二种方式是通过编程方式来确定 schema,这种方式主要是通过 Spark SQL 提供的 StructType 和 StructField 等 API 来编程实现,这种方式下我们不需要定义样本类,如本文中的案例一。

    在程序实现中,我们需要使用以便隐式的把 RDD 转化成 DataFrame 来操作(Scala 隐式转换)

  2. 通常来说,我们有两种方式了解 Spark 程序的执行流程。第一种是通过在控制台观察输出日志,另一种则更直观,就是通过 Spark Web Console 来观察 Driver 程序里各个部分产生的 job 信息以及 job 里包含的 stages 信息。
  3. 需要指出的是,熟练的掌握 Spark SQL/DataFrame 的知识对学习最新的 Spark 机器学习库 ML Pipeline 至关重要,因为 ML Pipeline 使用 DataFrame 作为数据集来支持多种的数据类型。



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值