Spark 计算总销量

Spark 计算总销量

题目:

某电商平台存储了所有商品的销售数据,平台希望能够找到销量最好的前 N 个商品。通过分析销售记录,帮助平台决策哪些商品需要更多的推广资源。

假设你得到了一个商品销售记录的文本文件

product_id, product_name, quantity, sale_date
1, "Smartphone", 10, "2024-11-01"
2, "Laptop", 5, "2024-11-02"
3, "T-Shirt", 25, "2024-11-03"
4, "Smartwatch", 8, "2024-11-04"
5, "Headphones", 12, "2024-11-05"
1, "Smartphone", 15, "2024-11-06"
2, "Laptop", 10, "2024-11-07"
3, "T-Shirt", 10, "2024-11-08"

各字段含义:
product_id: 商品ID
product_name: 商品名称
quantity: 销售数量
sale_date: 销售日期

任务:
计算总销量:计算每个商品的总销量,输出如下。

product_id  product_name  total_sales
1           Smartphone    25
2           Laptop        15
3           T-Shirt       35
4           Smartwatch    8
5           Headphones    12

找出销量最高的前 N 个商品:根据计算出的销量,找出前 N 个销售量最多的商品,N 由用户输入。N=3时输出如下:

product_id  product_name total_sales
3           T-Shirt       35
1          Smartphone     25
2           Laptop        15

运行

  1. 在桌面创建文件buy_count.txt,输入文本内容
  2. Java代码
import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.Function2;
import scala.Serializable;
import scala.Tuple2;
import java.util.Scanner;public class Test02 {/** Serializable* 标记一个类可以被序列化,* 即可以将其状态转换为字节流,* 以便进行持久化存储或在网络上传输* */static  class  Product implements Serializable{int product_id;String product_name;int quantity;@Overridepublic String toString() {return  String.format("%-10s %-20s %-10s", product_id, product_name, quantity);}}public static void main(String[] args) {// 文件路径// 获取用户的主目录并构建绝对路径String userHome = System.getProperty("user.home");String logFile = "file://" + userHome + "/Desktop/spark_test.txt";
//        String logFile = "file:///Desktop/spark_test.txt";// SparkConf 对象// setMaster("local")表示应用程序将在本地模式下运行// setAppName("SimpleApp")设置了应用程序的名称为SimpleAppSparkConf conf=new SparkConf().setMaster("local").setAppName("SimpleApp");// JavaSparkContext对象,它是与Spark交互的主要入口点。它接收前面创建的SparkConf对象作为参数JavaSparkContext sc=new JavaSparkContext(conf);// sc.textFile(logFile)加载文本文件内容// .cache()方法会将此RDD缓存起来以便后续重复使用时能更快访问JavaRDD<String> linesRDD = sc.textFile(logFile).cache();/** 按商品分组* JavaPairRDD 键值对* PairFunction用于定义将输入对象转换为键值对的逻辑* filter 方法对linesRDD中的每一行执行过滤(删除标题行)* mapToPair 会对每一行进行处理,生成键值对* 以product_name做键,Product对象做值* */JavaPairRDD<Integer, Product> productRDD = linesRDD.filter(new Function<String, Boolean>() {public Boolean call(String line) {return !line.contains("product_id");}}).mapToPair(new PairFunction<String, Integer, Product>(){@Overridepublic Tuple2<Integer, Product> call(String line) throws Exception {String[] fields = line.split(", ");Product product = new Product();product.product_id = Integer.parseInt(fields[0]);product.product_name = fields[1].replace("\"", "");product.quantity = Integer.parseInt(fields[2]);return new Tuple2<Integer, Product>(product.product_id, product);}});System.out.printf("%-10s %-20s %-10s%n", "product_id", "product_name", "total_sales");productRDD.foreach(tuple -> {Product value = tuple._2;System.out.println(value);});System.out.println("------------------------------------");/** 合并同一商品的数量* */JavaPairRDD<Integer, Product> productRDD2 = productRDD.reduceByKey(new Function2<Product, Product, Product>(){@Overridepublic Product call(Product product, Product product2) throws Exception {product2.quantity += product.quantity;return product2;}});// 按照商品id升序排序JavaPairRDD<Integer, Product> fourproductRankDescRDD = productRDD2.sortByKey(true);System.out.printf("%-10s %-20s %-10s%n", "product_id", "product_name", "total_sales");fourproductRankDescRDD.foreach(tuple -> {Product value = tuple._2;System.out.println(value);});// 将 JavaPairRDD 转换为 JavaRDD<Product>JavaRDD<Product> productRDD3 = productRDD2.values();// 按照 quantity 降序排序JavaRDD<Product> sortedByQuantityRDD = productRDD3.sortBy(product -> product.quantity, false, 1);Scanner scanner = new Scanner(System.in);System.out.print("请输入要显示的前N名商品:");int N =  scanner.nextInt();System.out.printf("%-10s %-20s %-10s%n", "product_id", "product_name", "total_sales");sortedByQuantityRDD.take(N).forEach(product -> System.out.println(product));}
}
  1. IDEA打包:https://blog.csdn.net/kelekele111/article/details/123047189
  2. 终端运行
/usr/local/spark/bin/spark-submit  ~/Desktop/Spark.jar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西安理工大学丨ChatGPT助力学术论文写作训练营-助力发表SCI一区、二区

在当今学术研究中&#xff0c;科研人员在撰写论文时面临诸多挑战。首先是信息量的剧增&#xff0c;科研人员需要快速消化新知识&#xff0c;筛选相关信息并清晰表达。但论文写作不仅是信息的罗列&#xff0c;还需要条理清晰、逻辑严密、语言精准&#xff0c;特别是在竞争激烈的…

网络安全应急响应流程图

一、网络安全应急响应建设的背景和现状 当前&#xff0c;许多地区和单位已经初步建立了网络安全预警机制&#xff0c;实现了对一般网络安全事件的预警和处置。但是&#xff0c;由于网络与信息安全技术起步相对较晚&#xff0c;发展时间较短&#xff0c;与其他行业领域相比&…

2024 阿里云Debian12.8安装apach2【图文讲解】

1. 更新系统&#xff0c;确保您的系统软件包是最新的 sudo apt update sudo apt upgrade -y 2. 安装 Apache Web 服务器 apt install apache2 -y 3. 安装 PHP 及常用的扩展 apt install php libapache2-mod-php -y apt install php-mysql php-xml php-mbstring php-curl php…

vue2播放视频和预览文件的组件以及使用方法

##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…

本地windows环境下,在vscode里将go项目打成docker镜像,并运行访问

此处只展示一个简单go代码实例. #前提:需要装好docker和golang环境,本地docker启动且配置好镜像源地址: # 容器镜像加速服务-云港网络 1.首先在vscode中写一个简单输出的demo go mod init &#xff0b;go mod tidy编译一下,命令运行如下: 2.使用命令生成Dockerfile文件 $ g…

GIT的使用方法以及汉化方法

1.下载git软件&#xff0c;可以从官网下载 下载后默认安装即可。 2.找到一个文件夹&#xff0c;或者直接打开gitbash gitbash可以使用cd指令切换目录的 打开后输入 git clone https:[git仓库的网页]即可克隆仓库 就是这个地址 克隆后即可使用代码 如果忘记了命令可以使用 -…

【Linux】Linux安全与密钥登录指南

在使用Linux服务器时&#xff0c;确保服务器的安全至关重要。本文将为你介绍一些关键的Linux安全措施&#xff0c;包括开启密钥登录、查看登录日志、限制登录IP以及查看系统中能够登录的账号。以下内容适合小白用户&#xff0c;通过简单的操作就能有效提升服务器的安全性。 目录…

前缀和(四)除自身以外数组的乘积

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C&#xff03;7.0中有哪些新特性&#xff1f;C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…

图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录 1.消费者模型2.生产者-消费者模型注意事项2.1资源释放顺序问题2.2消费者的声明问题2.3虚拟机和用户的权限问题 3.七种工作模式3.1简单模式3.2工作模式3.3发布/订阅模式3.4路由模式3.5通配符模式3.6RPC通信3.7发布确认 1.消费者模型 之前学习的这个消息队列的快速上手…

如果模块把http改成了https请求,测试方案应该怎么制定

首先确定要测试的模块、接口、功能等&#xff0c;以及测试的目标&#xff0c;确保HTTPS请求能够正常进行、数据传输安全等。 1.功能测试 回归相应的功能模块以及业务逻辑&#xff0c;是否正常 2.兼容测试 测试不同浏览器和操作系统是否能够正常支持HTTPS连接。 验证模块在各种设…

编写按层次顺序(同一层自左至右)遍历二叉树的算法。或:按层次输出二叉树中所有结点;

解&#xff1a;思路&#xff1a;既然要求从上到下&#xff0c;从左到右&#xff0c;则利用队列存放各子树结点的指针是个好办法。 这是一个循环算法&#xff0c;用while语句不断循环&#xff0c;直到队空之后自然退出该函数。 技巧之处&#xff1a;当根结点入队后&#xff0c;会…

头歌 Linux之线程管理

第1关&#xff1a;创建线程 任务描述 通常我们编写的程序都是单进程&#xff0c;如果在一个进程中没有创建新的线程&#xff0c;则这个单进程程序也就是单线程程序。本关我们将介绍如何在一个进程中创建多个线程。 本关任务&#xff1a;学会使用C语言在Linux系统中使用pthrea…

Leetcode101. 对称二叉树(HOT100)

链接 我的错误代码&#xff1a; class Solution { public:bool isSymmetric(TreeNode* root) {if(!root)return true;if(!root->left&&!root->right)return true;if(!(root->left&&root->right))return false;if(root->left->val!root->…

Java 集合:强大的数据管理工具

在 Java 编程中&#xff0c;集合是一种非常重要的工具&#xff0c;它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架&#xff0c;包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中&#xff0c;我们经常需要处理一组数据。…

qtcanpool 知 09:测试框架

文章目录 前言不满改进优化后语 前言 很久以前&#xff0c;作者写的代码都没有测试用例&#xff0c;最多就是写个 demo 验证一下&#xff0c;毕竟不是专业出身&#xff0c;也没经过大公司的洗礼。 后来&#xff0c;参与到一些项目才知道有专门的测试&#xff0c;而且开发也要测…

网络安全系列 之 SQL注入学习总结

目录 1. sql注入概述2. sql注入测试工具3. sql注入防御方法 3.1 问题来源3.2 防御方法4. SQL注入防御举例 4.1 使用JDBC时&#xff0c;SQL语句进行了拼接 1. 使用statement的executeQuery、execute、executeUpdate等函数时&#xff0c;传入的SQL语句拼接了来自外部的不可信参数…

《平衡之策:C++应对人工智能不平衡训练数据的数据增强方法》

在人工智能的广袤领域中&#xff0c;数据是驱动模型学习与成长的核心燃料。然而&#xff0c;不平衡的训练数据却如同一颗隐藏的暗礁&#xff0c;常常使模型的训练之船偏离正确航道&#xff0c;导致性能不佳与偏差增大。当我们聚焦于 C这一强大的编程语言时&#xff0c;又有哪些…

完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK

完整指南&#xff1a;在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK 要在Ubuntu 20.04系统中使用ROS 1环境配置和使用Orbbec SDK&#xff0c;可以遵循以下详细且系统化的步骤。这些步骤将引导您从下载必要的工具和SDK到学习如何使用这些资源&#xff0c;确保您能有效地利用…

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践

使用 Selenium 和 Python 爬取腾讯新闻&#xff1a;从基础到实践 在这篇博客中&#xff0c;我们将介绍如何利用 Selenium 和 Python 爬取腾讯新闻的内容&#xff0c;并将结果保存到 CSV 文件中。本教程包含以下内容&#xff1a; 项目简介依赖安装实现功能的代码实现中的关键技…