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

来源:互联网 发布:力宇刻字机端口设置 编辑:程序博客网 时间:2024/05/22 06:36

题目来源: 实验楼

在实验楼上看到这么一个题目, 感觉挺有意思的, 考察了 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)//切分字段//导入 Rowimport 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)))// 创建dfval 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