ITPub博客

首页 > 大数据 > Spark > spark系列二:sparksql内置函数实例

spark系列二:sparksql内置函数实例

原创 Spark 作者:jauar513 时间:2019-02-01 09:36:05 0 删除 编辑
在Spark 1.5.x版本,增加了一系列内置函数到DataFrame API中,并且实现了code-generation的优化。与普通的函数不同,DataFrame的函数并不会执行后立即返回一个结果值,而是返回一个Column对象,用于在并行作业中进行求值。Column可以用在DataFrame的操作之中,比如select,filter,groupBy等。函数的输入值,也可以是Column。

种类

函数

聚合函数

approxCountDistinct, avg, count, countDistinct, first, last, max, mean, min, sum, sumDistinct

集合函数

array_contains, explode, size, sort_array


scala版本:
1、countdistinct:
package com.spark.study.core
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.catalyst.expressions.CountDistinct
import org.apache.spark.sql.functions._
object infunction {
  def main(args:Array[String]){
    val conf = new SparkConf()
                  .setAppName("loadandsave")
                  .setMaster("local")
    val sc = new SparkContext(conf)
    val sqlcontext = new SQLContext(sc)
    import sqlcontext.implicits._
    val useraccesslog = Array(
    "2018-05-18,00001",
    "2018-05-18,00001",
    "2018-05-18,00002",
    "2018-05-18,00001",
    "2018-05-19,00001",
    "2018-05-19,00002",
    "2018-05-19,00002").toSeq
   
    val rdd1 = sc.parallelize(useraccesslog, 5)
    val rowrdd =  rdd1.map(x => Row(x.split(",")(0),x.split(",")(1)))
    val structtype = StructType(Array(StructField("date",StringType,true),StructField("userid",StringType,true)))
    val df1 = sqlcontext.createDataFrame(rowrdd, structtype)
    df1.groupBy("date").agg('date, countDistinct('userid)).map(x =>Row(x(1),x(2))).collect().foreach(row => println(row))
      }
  }

2、sum:
package com.spark.study.core
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.DoubleType
import org.apache.spark.sql.functions._
object infunctionsum {
  def main(args:Array[String]){
    val conf = new SparkConf()
                  .setAppName("loadandsave")
                  .setMaster("local")
    val sc = new SparkContext(conf)
    val sqlcontext = new SQLContext(sc)
    import sqlcontext.implicits._
    val useraccesslog = Array(
    "2018-05-18,55.9,0001",
    "2018-05-18,33,0002",
    "2018-05-18,68,0001",
    "2018-05-18,115,0001",
    "2018-05-19,36,0002",
    "2018-05-19,67,0001",
    "2018-05-19,66,0002").toSeq
   
    val rdd1 = sc.parallelize(useraccesslog, 5)
    val filterrdd = rdd1.filter(x => if (x.split(",").length == 3) true else false)
    val rowrdd =  rdd1.map(x => Row(x.split(",")(0),x.split(",")(1).toDouble,x.split(",")(2)))
  
    val structtype = StructType(Array(StructField("date",StringType,true),StructField("scales",DoubleType,true),StructField("userid",StringType,true)))
    val df1 = sqlcontext.createDataFrame(rowrdd, structtype)
    df1.groupBy("date").agg('date, sum('scales)).map(x =>Row(x(1),x(2))).collect().foreach(row => println(row))
     
  }
}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30541278/viewspace-2154848/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-10-25

  • 博文量
    24
  • 访问量
    25730