大数据实战 --- 美团外卖平台数据分析

news2024/12/24 21:48:20

目录

开发环境 

数据描述

功能需求

数据准备

数据分析

RDD操作

Spark SQL操作

创建Hbase数据表

创建外部表

统计查询


开发环境 

Hadoop+Hive+Spark+HBase

启动Hadoop:start-all.sh

启动zookeeper:zkServer.sh start

启动Hive

nohup hiveserver2 1>/dev/null 2>&1 &

beeline -u jdbc:hive2://192.168.152.192:10000

启动Hbase

start-hbase.sh

hbase shell

启动Spark

spark-shell

数据描述

meituan_waimai_meishi.csv 是美团外卖平台的部分外卖 SPU(Standard Product Unit , 标准产品单元)数据,包含了外卖平台某地区一时间的外卖信息。具体字段说明如下:
 

功能需求

数据准备

请在 HDFS 中创建目录 /app/data/exam ,并将 meituan_waimai_meishi.csv 文件传到该
目录。并通过 HDFS 命令查询出文档有多少行数据。

创建文件
hdfs dfs -mkdir -p /app/data/exam

上传目录
hdfs dfs -put ./meituan_waimai_meishi.csv /app/data/exam

查看文件行数
hdfs dfs -cat /app/data/exam/meituan_waimai_meishi.csv | wc -l

数据分析

使用 Spark, 加载 HDFS 文件系统 meituan_waimai_meishi.csv 文件,并分别使用 RDD
Spark SQL 完成以下分析(不用考虑数据去重)

RDD操作

    val spark: SparkSession = SparkSession.builder()
      .master("local[*]")
      .appName("exam")
      .getOrCreate()
    val sc: SparkContext = spark.sparkContext
    val lines: RDD[String] = sc.textFile("hdfs://192.168.152.192:9000/app/data/exam/meituan_waimai_meishi.csv")


    val lines1: RDD[Array[String]] = lines.filter(x => x.startsWith("spu_id") == false)
      .map(x => x.split(","))
①统计每个店铺分别有多少商品(SPU)。
lines1.map(x => (x(2), 1)).reduceByKey(_ + _).collect().foreach(println)

②统计每个店铺的总销售额。

lines1.map(x => (x(2), Try(x(5).toDouble).toOption.getOrElse(0.0) *
  Try(x(7).toInt).toOption.getOrElse(0))).reduceByKey(_ + _)
  .collect().foreach(println)

③统计每个店铺销售额最高的前三个商品,输出内容包括店铺名,商品名和销售额,其

中销售额为 0 的商品不进行统计计算,例如:如果某个店铺销售为 0,则不进行统计。
    //方法一
    lines1.map(x => (x(2), x(4), Try(x(5).toDouble).toOption.getOrElse(0.0) *
      Try(x(7).toInt).toOption.getOrElse(0)))
      .filter(x => x._3 > 0).groupBy(x => x._1)
      .mapValues(value => value.toList.sortBy(x => -x._3).take(3)) //负号(-)降序
      .flatMapValues(x => x)
      .collect().foreach(println)
    //方法二
    lines1.map(x => (x(2), x(4), Try(x(5).toDouble).toOption.getOrElse(0.0) *
      Try(x(7).toInt).toOption.getOrElse(0)))
      .filter(x => x._3 > 0).groupBy(x => x._1)
      .flatMap(x => x._2.toList.sortBy(y => 0 - y._3).take(3))
      .foreach(println)

    //方法三
    lines1.map(x => (x(2), x(4), Try(x(5).toDouble).toOption.getOrElse(0.0) *
      Try(x(7).toInt).toOption.getOrElse(0)))
      .filter(x => x._3 > 0).groupBy(x => x._1)
      .map(x => {
        var shop_name: String = x._1;
        var topThree: List[(String, String, Double)] = x._2.toList.sortBy(item => 0 - item._3).take(3);
        var shopNameAndSumMoney: List[String] = topThree.map(it => it._2 + " " + it._3);
        (shop_name, shopNameAndSumMoney)
      })
      .foreach(println)

Spark SQL操作

    val spark: SparkSession = SparkSession.builder()
      .master("local[*]")
      .appName("exam")
      .getOrCreate()
    val sc: SparkContext = spark.sparkContext
    val spuDF: DataFrame = spark.read.format("csv").option("header", true).load("hdfs://192.168.152.192:9000/app/data/exam/meituan_waimai_meishi.csv")
    
    spuDF.createOrReplaceTempView("sputb")

①统计每个店铺分别有多少商品(SPU)。

spark.sql("select * from sputb").show()

②统计每个店铺的总销售额。

spark.sql("select shop_name,count(shop_name) as num  from sputb group by shop_name").show()

③统计每个店铺销售额最高的前三个商品,输出内容包括店铺名,商品名和销售额,其 中销售额为 0 的商品不进行统计计算,例如:如果某个店铺销售为 0,则不进行统计。

spark.sql("select shop_name, sum(spu_price * month_sales)  as sumMoney  from sputb group by shop_name").show()

创建Hbase数据表

在 HBase 中创建命名空间(namespaceexam,在该命名空间下创建 spu 表,该表下有

1 个列族 result。
create 'exam:spu','result'

创建外部表

请 在 Hive 中 创 建 数 据 库 spu_db 

create database spu_db;

  在 该 数 据 库 中 创 建 外 部 表 ex_spu 指 向 /app/data/exam 下的测试数据 ;

create external table if not exists  ex_spu (
    spu_id string,
    shop_id string,
    shop_name string,
    category_name string,
    spu_name string,
    spu_price double,
    spu_originprice double,
    month_sales int,
    praise_num int,
    spu_unit string,
    spu_desc string,
    spu_image string
)
row format delimited fields terminated by ","
stored as textfile location "/app/data/exam"
tblproperties ("skip.header.line.count"="1");

创建外部表 ex_spu_hbase 映射至 HBase 中的 exam:spu 表的 result 列族

create external table if not exists ex_spu_hbase
(
    key string,
    sales double,
    praise int
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with
serdeproperties ("hbase.columns.mapping"=":key,result:sales,result:praise")
tblproperties ("hbase.table.name"="exam:spu");

统计查询

① 统计每个店铺的总销售额 sales, 店铺的商品总点赞数 praise ,并将 shop_id
shop_name 的组合作为 RowKey ,并将结果映射到 HBase
insert into ex_spu_hbase
select concat(tb.shop_id,tb.shop_name) as key, tb.sales,tb.praise from
(select shop_id,shop_name,sum(spu_price*month_sales) as sales, sum(praise_num) as praise
from ex_spu group by shop_id,shop_name) tb;
② 完成统计后,分别在 hive HBase 中查询结果数据。
hive > select * from ex_spu_hbase;

hbase(main):007:0> scan 'exam:spu'

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

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

相关文章

人工智能会影响测试工程师吗

并不是危言耸听 当下最火的是什么,那非ChatGPT莫属了,以ChatGPT为代表的各类AIGC工具,在不断颠覆我们的认知,不仅能完成律师,医学考试;还能画出一张精美的设计图,拿下艺术大赛一等奖。 以之对…

C#基础学习--反射和特性

元数据和反射 要使用反射,必须使用System.Reflection 命名空间 Type类 Type是一个抽象类,用来包含类型的特性,使用这个类的对象可以让我们获取程序使用的类型的信息 我们可以从Type对象中获取需要了解的有关类型的几乎所有信息 获取Type对象…

Node.js下载安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位 Tips:如果想下载指定版本,点击【以往的版本】,即可选择自己想要的版本下载 二、安装程序 &…

在 VSCode 中让 TypeScript 错误更漂亮且易于阅读

简介 TypeScript 是一种流行的编程语言,为 JavaScript 提供了静态类型和改进的错误检测。然而,随着类型的复杂性增加,错误的复杂性也增加了。这就是 Pretty TypeScript Errors VSCode 插件的用途,它可以在 Visual Studio Code 中…

8.线性搜索算法和二进制搜索算法

算法:线性搜索算法 线性搜索是一种非常简单的搜索算法。在这种类型的搜索中,逐个对所有项目进行顺序搜索。检查每个项目,如果找到匹配项,则返回该特定项目,否则搜索将继续,直到数据收集结束。 算法 Linea…

【数据结构】- 链表之单链表(下)

文章目录 前言一、单链表(下)1.1 查找修改1.2 在任意位置插入1.2.1 在pos位置插入(也就是pos位置之前)1.2.2 在pos位置之后插入 1.3 在任意位置删除1.3.1 删除pos位置得值1.3.2 删除pos位置后面的值 二、完整代码总结 前言 未来藏在迷雾中 叫人看来胆怯 带你踏足其中 就会云开…

【C++类和对象】类和对象(中):拷贝构造函数 {拷贝构造函数的概念及特征,拷贝构造函数不能使用传值传参,编译器自动生成的拷贝构造函数}

四、拷贝构造函数 4.1 概念 在创建对象时,可否创建一个与已存在对象一某一样的新对象呢? 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器…

MySQL高级(二)

一、SQL优化 (一)插入数据 批量插入 多次插入每一次insert都要与数据库建立连接。 INSERT INTO 表名 VALUES (),(),(); 一次插入数据不宜过多,不要超过1000条。 手动提交事务 START TRANSACTION; INSERT INTO 表名 VALUES (),(),(); I…

车载以太网 - SomeIP - 协议用例 - Format_01

目录 1、验证Client ID字段静态设置为0x0000 2、验证Session ID字段静态设置为0x0001 3、验证Protocol Version字段静态设置为0x01

SpringCloud:ElasticSearch之自动补全

当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 因为需要根据拼音字母来推断,因此要用到拼音分词功能。 1.拼音分词器…

【移动端网页布局】移动端网页布局基础概念 ④ ( 物理像素 | 物理像素比 | 代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 )

文章目录 一、物理像素 / 物理像素比二、代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 一、物理像素 / 物理像素比 移动端 网页开发 与 PC 端开发有很多不同之处 , 在图片处理方向需要采用 二倍图 / 三倍图 / 多倍图 方式进行图片处理 ; 图片处理的方式与如下的 物…

项目支付接入支付宝【沙箱环境】

前言 订单支付接入支付宝,使用支付宝提供的沙箱机制模拟为订单付款。我这里主要记录一下沙箱环境如何接入到系统中,具体细节的实现。按照官方文档来就可以了。 1、使用步骤 这里有几个重要数据要拿到,一个是支付宝的公钥和私钥&#xff0c…

ClickHouse监控系统Prometheus+Grafana

目录 1 PrometheusGrafana概述2 安装Prometheus Grafana3 配置ClickHouse4 配置Grafana 1 PrometheusGrafana概述 ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中( system.*)。所以我们对于 CH 自身的一些运行指标的监控数据,也主要来自这些系统表。…

docoker笔记

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

RabbitMQ【#1】是什么,有什么用

RabbiMQ是什么? RabbitMQ是一种开源的消息队列软件,它实现了高级消息队列协议(AMQP)并支持多种编程语言。它可以用于将消息从一个应用程序传递到另一个应用程序或进程,并支持分布式系统中的异步消息通信。RabbitMQ的主…

【Linux】System V 共享内存、消息队列、信号量

🍎作者:阿润菜菜 📖专栏:Linux系统编程 system V共享内存介绍 System V 共享内存是一种进程间通信的机制,它允许多个进程共享一块物理内存区域(称为“段”)。System V 共享内存的优点是效率高&…

AD21 PCB----过滤、捕获、板子边框绘制、精准移动

目录 过滤器和捕获 板子边框绘制 精准移动 过滤器和捕获 板子边框绘制 两种方式均在Mechanical 1 方式一: 第一步:利用PCB的基础图形进行绘制边框 第二步:选中绘制的图形 第三步: 方式二:外部导入 第一步&#x…

SpringCloud 微服务系列——【服务间的通信方式、OpenFeign、Hystrix组件使用】

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【UE 粒子系统】电火花粒子效果

效果 步骤 1. 新建一个粒子系统,命名为“SparkParticles” 再新建一个材质,命名为“SparkParticleMaterial” 2. 打开“SparkParticleMaterial”,将混合模式改为半透明,着色模型为无光照 然后添加如下节点 3. 打开“SparkParticl…

输入输出练习

文章目录 1. AB(1)2. AB(2)3. AB(3)4. AB(4)计算一系列数的和5. AB(5) 计算一系列数的和6. AB(6)7. AB(7)8. 字符串排序(1)9. 字符串排序(2)10 字符串排序(2)11. 注意数据范围 1. AB(1) import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public …