Apache Spark 练习四:使用Spark分析挖掘零售交易数据

一、源数据

本章所分析的数据来自于一家英国的零售电商平台在01/12/2010至09/12/2011期间的交易数据(https://www.kaggle.com/datasets/carrie1/ecommerce-data),每条记录由8个属性组成,具体的含义如下表所示:

字段名称类型含义举例
InvoiceNostring订单编号(退货订单以C开头)536365
StockCodestring产品代码85123A
Descriptionstring产品描述WHITE METAL LANTERN
Quantityinteger购买数量(负数表示退货)6
InvoiceDatestring订单日期和时间12/1/2010 8:26
UnitPricedouble单价(英镑)3.39
CustomerIDinteger客户编号17850
Countrystring国家名称United Kingdom

二、练习题

0. 数据预处理

我们将原始文件存放在HDFS的/SparkLearning目录下,然后从HDFS中读取数据到DataFrame格式。由于顾客编号CustomID和商品描述Description均存在部分缺失,所以需要先进行数据清洗,过滤掉有缺失值的记录。

// 加载Spark会话
val spark = SparkSession
  .builder()
  .appName("E-Commerce")
  .getOrCreate()
import spark.implicits._

// 读取源数据
val raw_data = spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("hdfs:///SparkLearning/E_Commerce_Data.csv")
// 过滤掉有缺失值的记录
val df = raw_data
  .filter($"CustomerID" =!= 0)
  .filter($"Description" =!= "")

1. 客户数最多的10个国家

val res = df
  .select($"CustomerID", $"Country")
  .distinct()
  .groupBy($"Country")
  .count()
  .withColumnRenamed("count", "CustomerNum")
  .sort($"CustomerNum".desc)
  .limit(10)

2. 销量最高的10个国家

val res = df
  .select($"Quantity", $"Country")
  .groupBy($"Country")
  .sum("Quantity")
  .withColumnRenamed("sum(Quantity)", "totalQuantity")
  .sort($"totalQuantity".desc)
  .limit(10)

3. 各个国家的总销售额分布情况

val res = df
  .select($"Country", ($"Quantity" * $"UnitPrice").as("Revenue"))
  .groupBy($"Country")
  .sum("Revenue")
  .withColumnRenamed("sum(Revenue)", "totalRevenue")
  .orderBy($"totalRevenue".desc)

4. 销量最高的10个商品

val res = df
  .select($"StockCode", $"Description", $"Quantity")
  .groupBy($"StockCode", $"Description")
  .sum("Quantity")
  .withColumnRenamed("sum(Quantity)", "totalQuantity")
  .orderBy($"totalQuantity".desc)
  .limit(10)

5. 商品描述的热门关键词Top300

val res = df
  .select($"Description")
  .flatMap(row => row.getString(0).split(" "))
  .map(word => word.toLowerCase)
  .filter(word => word.nonEmpty)
  .toDF("keyword")
  .groupBy($"keyword")
  .count()
  .orderBy($"count".desc)
  .limit(300)

6. 退货订单数最多的10个国家

val res = df
  .filter($"Quantity" < 0)
  .select($"Country", $"InvoiceNo")
  .distinct()
  .groupBy($"Country")
  .count()
  .orderBy($"count".desc)
  .limit(10)

7. 月销售额随时间的变化趋势

val res = df
  .select(
    date_format(to_timestamp($"InvoiceDate", "M/d/yyyy H:mm"), "yyyy-MM").as("month"),
    ($"Quantity" * $"UnitPrice").as("revenue")
  )
  .groupBy($"month")
  .sum("revenue")
  .withColumnRenamed("sum(revenue)", "totalRevenue")
  .orderBy($"month")

8. 日销量随时间的变化趋势

val res = df
  .select(
    to_date(to_timestamp($"InvoiceDate", "M/d/yyyy H:mm")).as("date"),
    $"Quantity"
  )
  .groupBy($"date")
  .sum("Quantity")
  .withColumnRenamed("sum(Quantity)", "totalQuantity")
  .orderBy($"date")

9. 各国的购买订单量和退货订单量的关系

val res = df
  .select("Country", "InvoiceNo")
  .distinct()
  .selectExpr(
    "Country",
    "IF(InvoiceNo NOT REGEXP '^C', 1, 0) AS purchase",
    "IF(InvoiceNo REGEXP '^C', 1, 0) AS refund"
  )
  .groupBy("Country")
  .agg(
    Map(
      "purchase" -> "sum",
      "refund" -> "sum"
    )
  )

10. 商品的平均单价与销量的关系

val res = df
  .select("StockCode", "UnitPrice", "Quantity")
  .groupBy("StockCode")
  .agg(
    (sum_distinct($"UnitPrice") / count_distinct($"UnitPrice")).as("avgPrice"),
    sum($"Quantity").as("totalQuantity")
  )
  .select("StockCode", "avgPrice", "totalQuantity")

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark是一个分布式计算框架,适用于处理大规模数据的场景。它可以基于零售交易数据进行数据处理分析,可以进行数据清洗、转换、聚合等操作,支持SQL语言查询和复杂的机器学习算法计算。Spark可以对数据进行分布式处理,从而实现高效、快速的数据处理分析。同时,Spark还支持大量的扩展插件,可以轻松的进行数据的可视化和呈现。 ### 回答2: 零售交易数据是当今商业分析领域中的一个重要数据源。利用这些数据可以帮助企业对销售情况、商品货架布局、市场营销策略等方面进行分析和改进。而Spark作为当今主流的大数据处理分析框架,也是处理零售交易数据的最佳选择之一。 首先,需要将零售交易数据从各种数据源进行整合。这些数据源包括POS终端、在线销售平台、CRM系统等等。Spark可以通过数据导入、批量处理等方式,将这些数据源的数据整合到同一个地方,建立一个完整的零售交易数据集。 接下来,利用Spark可以进行多维度分析,例如: 一、商品售出情况:对商品的销售数量、价值、售价、月份、季度、区域、门店等进行统计和分析。 二、会员消费数据:对会员消费数据进行分析,了解会员的消费习惯、消费偏好、消费频次等等。 三、促销活动效果:对促销活动的销售效果进行跟踪和分析,看看促销对销售有没有带来积极的影响。 、门店销售数据:对门店的销售数据进行分析,找出最高、最低的销售门店,了解门店地理位置对销售的影响等等。 最后,可以使用数据可视化工具将Spark分析结果呈现出来,以便更直观地展现数据分析结果。例如,通过柱状图、折线图、饼图等等,直观地了解每个商品的销售情况,或是月份销售额的走向等等。 通过上述数据处理分析方式,企业可以更好地了解其销售情况,优化业务决策,提高经营效益。 ### 回答3: 基于零售交易数据Spark数据处理分析 零售业是一种大规模数据的产业,每天都会产生大量的交易数据。这些数据可以被收集并分析,以帮助零售商更好地了解客户,改进业务和增加销售额。Spark是一种在大数据领域广泛使用的分布式计算引擎,可以用于处理分析这种大量的零售交易数据Spark提供了许多工具和库,可以让数据科学家和数据工程师在处理分析零售交易数据时更加高效和方便。其中,主要包括以下几个方面: 1. Spark Streaming: 零售商可以使用Spark Streaming实时处理实时交易数据Spark Streaming可以将实时数据源转换为流数据,并在流数据上应用Spark操作,因此零售商可以实时了解他们的交易数据。 2. Spark SQL: Spark SQL是一种使数据科学家和数据工程师能够更轻松地查询和分析结构化数据的方式。使用Spark SQL,零售商可以轻松地通过类似SQL的语法查询和分析他们的交易数据。 3. MLlib: MLlib是Spark中的机器学习库,它提供了许多机器学习算法,包括分类、回归、聚类等。零售商可以使用这些算法来识别交易中的模式,并进一步更好地预测客户的需求和行为。 4. GraphX: GraphX是Spark中的图形处理库,零售商可以使用它来建立交易网络,分析客户之间的关系,以及找到最受欢迎的产品。 通过使用这些工具和库,零售商可以获得各种见解,例如: 1. 最受欢迎的产品类别: 使用Spark SQL和机器学习算法,零售商可以识别出最受欢迎的产品类别,并相应地增加这些产品的库存。 2. 客户行为模式: 使用Spark Streaming实时处理实时交易数据零售商可以发现客户的行为模式,例如购买时间和购买频率。这样,零售商可以优化销售策略以更好地满足客户的需求。 3. 交易网络: 使用GraphX来建立交易网络,并分析客户之间的关系。这样,零售商可以更好地推销产品,同时加强客户关系,提高忠诚度。 因此,Spark是一种非常有用的工具来处理分析零售交易数据。通过使用Spark Streaming、Spark SQL、MLlib和GraphX等工具和库,零售商可以更好地了解客户,优化业务流程,并增加销售额。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值