Spark 解决 某商品日交易额统计

本文介绍了一个利用Spark DataFrame处理销售数据的实战案例,通过对原始数据进行过滤、转换等操作,最终统计出每天的总销售额,并保存结果。

题目来源: 实验楼

在实验楼上看到这么一个题目, 感觉挺有意思的, 考察了 dataframe 的一些基本用法(创建和汇聚).

描述


有如下数据:
2017-5-02,2436.33,10032
2017-5-03,2738.23,10432
2017-5-03,2323.45,10233
2017-5-02,3541.05
2017-5-03,1323.56,10245
2017-5-04,2123.305
2017-5-04,2654.64,10231
……
……

数据集各字段含义如下:

字段一字段二字段三
date (日期)sale_amount (日销售额)sale_id(商品编号)


注意:数据集里有些只有两个字段,可以理解为”脏数据”,”异常数据”,所以在计算时我们只统计有效数据,一定记住过滤!

目标


  • 保证输出的存放路径为 /home/shiyanlou/res
  • date 类型请使用 StringType
  • sale_amount 类型请使用 DoubleType
  • 请使用 saveAsTextFile 方式保存
  • 结果集不要求按 date 排序(当然您也可以这么做),只统计每天的 sale_amount 即可

可以用cat 命令查看你程序的输出结果,结果示例展示如下:

cat res/*
[2017-4-03,182.8099999998]
[2017-4-05,213.044]
[2017-4-01,187.629999993]
[2017-4-02,157.733]
[2017-4-04,472.23]

可以看到,每一行只有两个字段,例如: 2017-4-03,182.8099999998 这一行, 2017-4-03表示这一天,182.8099999998表示在这一天里,所有商品交易额汇总后的金额。

提示


  • 可能需要使用 import 导入 Spark 依赖
  • 通过原始 RDD 创建 RDD 的 Rows
  • 通过 StructType 匹配 Rows 里的结构创建 schema
  • 通过 Spark 提供的 createDataFrame(row,schema) 方法创建 DataFrame,而不是 sqlContext
  • groupBy 函数分组
  • agg 聚合
  • Spark 2.x 与 Spark 1.x DataFrame 区别

知识点


  • textFile
  • StructType
  • createDataFrame
  • groupBy
  • agg
  • saveAsTextFile

解答


//加载数据集
val rdd1 = sc.textFile("/home/shiyanlou/data.txt")

//过滤
val rdd2 = rdd1.filter (log => log.split(",").length == 3)

//切分字段
//导入 Row
import org.apache.spark.sql.Row
//取前两个字段
val rowRdd3 = rdd2.map { log => Row(log.split(",")(0), log.split(",")(1).toDouble) }

//导入
import org.apache.spark.sql.types._

//创建映射对应关系
val schema = StructType(Array(
StructField("date", StringType, true),
StructField("sale_amount", DoubleType, true))
)

// 创建df
val saleDF = spark.createDataFrame(rowRdd3, schema)  
import spark.implicits._

saleDF.groupBy("date").agg('date, sum('sale_amount)).rdd.map { row => Row(row(1), row(2)) }.coalesce(1,true).saveAsTextFile("/home/shiyanlou/res")

完整的数据(data.txt)


2017-5-01,1555.05,10001
2017-5-01,2423.15,10042
2017-5-01,215.20
2017-5-01,2356.05,10043
2017-5-01,2748.87,10044
2017-5-01,2613.02,10045
2017-5-02,2515.05,10001
2017-5-02,2323.35,10022
2017-5-01,445.30
2017-5-01,2326.05,10033
2017-5-01,2444.20,10434
2017-5-01,2323.24,10054
2017-5-02,2456.23,10441
2017-5-03,2434.42,10434
2017-5-02,2436.34,10032
2017-5-03,2738.23,10432
2017-5-03,2323.34,10233
2017-5-03,2555.05,10001
2017-5-03,2677.15,10434
2017-5-03,345.52
2017-5-03,2345.05,10553
2017-5-02,2458.54,10455
2017-5-03,2454.45,10344
2017-5-03,1255.12,10443
2017-5-04,2323.32,10432
2017-5-04,2356.22,10531
2017-5-02,3248.22,10533
2017-5-05,2613.02,10233

### Spark在英国零售电商平台的应用案例和解决方案 #### 应用背景 随着电子商务的发展,零售商面临着处理海量交易数据的需求。Spark作为一种快速通用的大规模数据处理引擎,在提升数据分析效率方面具有显著优势[^1]。 #### 数据处理与分析优化 对于英国的零售电商而言,利用Spark可以实现更高效的数据处理流程。通过分布式计算框架,能够加速商品推荐系统的构建以及客户行为模式挖掘的速度。例如,某知名在线超市采用Spark来支持其个性化营销活动,通过对大量历史订单记录进行实时分析,从而提供更加精准的商品推荐服务给消费者。 #### 实时库存管理 借助于Spark Streaming模块,企业还可以实现实时监控仓库中的存货水平变化情况,并据此调整补货计划或促销策略。这不仅有助于减少缺货现象发生概率,同时也提高了供应链整体运作效率。 #### 客户体验改进 为了更好地理解客户需求并改善用户体验,许多平台会收集来自网站访问者的行为轨迹作为输入源之一。基于此,Spark MLlib库提供了丰富的机器学习算法供开发者选择实施预测模型建设工作,比如分类、聚类等方法可用于细分市场群体特征识别;而回归则适用于销售额趋势预估等方面的研究实践[^2]。 ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("RetailEcommerce").getOrCreate() # 加载销售数据集 sales_data = spark.read.csv("/path/to/salesdata", header=True, inferSchema=True) # 进行基本统计操作 summary_stats = sales_data.describe().show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值