SparkSQL内置函数统计每日销售金额实例

本文介绍如何使用Apache Spark SQL处理日销售额数据。通过创建SparkConf并设置应用名称为DailySale,利用SparkContext加载数据,接着定义SQLContext进行数据处理。通过对原始数据的过滤和映射操作,将有效数据转换为DataFrame格式,并最终实现按日期分组统计总销售额的功能。

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

package com.hhb.spark.sql

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

/**
  * Created by dell on 2017/7/28.
  */
object DailySale {

  def main(args: Array[String]) {
    val conf = new SparkConf()
      .setAppName("DailySale")
      .setMaster("local")
      .set("spark.testing.memory", "2147480000")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

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

    // 模拟数据
    val userSalelog = Array(
      "2017-07-01,55.05,1133",
      "2017-07-01,54.05,",
      "2017-07-01,35.05,1144",
      "2017-07-02,25.05,1155",
      "2017-07-01,65.05,1123",
      "2017-07-01,25.15,",
      "2017-07-02,65.05,1123",
      "2017-07-02,25.15,"
    )
    val userSaleLogRDD = sc.parallelize(userSalelog, 5)

    // 有效销售日志的过滤(过滤掉无效的日志)
    val filterdUserSaleLogRDD = userSaleLogRDD
      .filter{ log => if (log.split(",").length == 3) true else false }

    val userSaleLogRowRDD = filterdUserSaleLogRDD
      .map{
        log => Row(log.split(",")(0),
        log.split(",")(1).toDouble)
      }

    val structType = StructType(Array(
      StructField("date", StringType, true),
      StructField("sale_amount", DoubleType, true)
    ))

    // 转成dataframe
    val userSaleLogDF = sqlContext.createDataFrame(userSaleLogRowRDD, structType)

    // 开始进行每日销售额的统计
    userSaleLogDF.groupBy("date")
      .agg('date, sum('sale_amount))
      .map{ row => Row(row(1), row(2)) }
      .collect()
      .foreach(println)

  }

}

转载于:https://my.oschina.net/hehongbo/blog/1491556

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值