题目来源: 实验楼
在实验楼上看到这么一个题目, 感觉挺有意思的, 考察了 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 DataFrame处理销售数据的实战案例,通过对原始数据进行过滤、转换等操作,最终统计出每天的总销售额,并保存结果。
1484

被折叠的 条评论
为什么被折叠?



