SparkSQL内置函数统计uv实例
博客专区 > 别寒 的博客 > 博客详情
SparkSQL内置函数统计uv实例
别寒 发表于4个月前
SparkSQL内置函数统计uv实例
  • 发表于 4个月前
  • 阅读 6
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

package com.hhb.spark.sql

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType};
import org.apache.spark.sql.functions._

/**
  * Created by dell on 2017/7/28.
  */
object DailyUV {
  def main(args: Array[String]) {
    val conf = new SparkConf()
      .setAppName("DailyUV")
      .setMaster("local")
      .set("spark.testing.memory", "2147480000")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    // 要使用spark sql 内置函数,就必须在这里导入sqlcontext下的隐式转换
    import sqlContext.implicits._

    // 构造用户访问日志数据,并创建dataframe
    // 模拟用户访问日志,日志用逗号隔开,第一列日期,第二栏用户id
    val userAccesslog = Array(
      "2017-07-01,1122",
      "2017-07-01,1122",
      "2017-07-01,1123",
      "2017-07-01,1124",
      "2017-07-01,1124",
      "2017-07-01,1123",
      "2017-07-02,1124",
      "2017-07-02,1124",
      "2017-07-02,1123",
      "2017-07-02,1124",
      "2017-07-03,1124"
    )
    val userAccessLogRDD = sc.parallelize(userAccesslog, 5)

    // 将模拟出来的用户访问日志RDD,转换为dataframe
    // 首先将普通的rdd转换为元素为row的rdd
    val userAccessLogRowRDD = userAccessLogRDD
      .map{ log => Row(log.split(",")(0), log.split(",")(1).toInt) }
    // 构造dataframe的元数据
    val structType = StructType(Array(
      StructField("date", StringType, true),
      StructField("userid", IntegerType, true)
    ))

    // 使用sqlcontext创建dataframe
    val userAccessLogRowDF = sqlContext.createDataFrame(userAccessLogRowRDD, structType)

    // 这里正式开始使用spark1.5.x提供的最新特效 内置函数
    /**
      * 聚合函数的用法
      * 首先,对dataFrame调用groupBy方法,对某一列进行分组
      * 然后,调用agg方法,第一个参数必须传入之前在groupBy()方法中出现的字段
      * 第二个参数,传入countDistinct、sum、first等,spark提供的内置函数
      * 内置函数中,传入的参数,也是用单引号作为前缀的其他的字段
      */
    userAccessLogRowDF.groupBy("date")
      .agg('date, countDistinct('userid))
      .map{ row => Row(row(1), row(2)) }
      .collect()
      .foreach(println)



  }
}

共有 人打赏支持
粉丝 29
博文 254
码字总数 130346
×
别寒
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: