sparkSQL UDF创建

1.目的

    定义并使用sparkSQL UDF函数

2.元素

val product_order=Array(
  ("20170909,tom"),
  ("20170909,jack") ,
  ("20170909,tom"),
  ("20170910,tony")
)

3.脚本

/**
  * Created by puwenchao on 2017-09-26.
  */
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object udf{
  def main(args: Array[String]) {
    //屏蔽日志
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    //生成sc\ssc
    val sparkConf=new SparkConf().setAppName("udf").setMaster("local")
    val sc=new SparkContext(sparkConf)
    val sqlContext=new SQLContext(sc)

    // 1.创建RDD并转化为Row RDD
    val product_order=Array(
      ("20170909,tom"),
      ("20170909,jack") ,
      ("20170909,tom"),
      ("20170910,tony")
    )
    val product_orderRDD=sc.parallelize(product_order,2)
    val product_orderRowRDD= product_orderRDD.map(_.split(",")).map(log=>Row(log(0),log(1)))

    // 2.构造元数据
    val structType=StructType(Array(
      StructField("time",StringType,true),
      StructField("user",StringType,true)
    ))

    // 3.使用sqlContext创建dataframe
    val product_orderDF=sqlContext.createDataFrame(product_orderRowRDD,structType)

    // 4.注册成临时表
    product_orderDF.registerTempTable("product_order")

    //定义UDF
    sqlContext.udf.register("strlen",(str:String)=>str.length)

    //运用UDF
    sqlContext.sql("select time,strlen(user) from product_order")
      .rdd                  //DF转为Row RDD
      .map(x=>(x(0),x(1)))  //Row RDD转为普通RDD
      .foreach(println)
  }
}

4.输出

    (20170909,3)
    (20170909,4)
    (20170909,3)
    (20170910,4)

 

转载于:https://my.oschina.net/puwenchao/blog/1543735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值