网站地图什么时候提交好,做群头像的网站在线制作,胶南网站建设,网站地图 百度目录
概要
源数据获取
写Python代码爬取数据
Scala介绍与数据处理
1.Sacla介绍 2.Scala数据处理流程
数据可视化
最终大屏效果
小结 概要 本文的主题是获取下厨房网站月度最佳栏目近十年数据#xff0c;最终进行数据清洗、处理后生成所需的数据库表#xff0c;最终进… 目录
概要
源数据获取
写Python代码爬取数据
Scala介绍与数据处理
1.Sacla介绍 2.Scala数据处理流程
数据可视化
最终大屏效果
小结 概要 本文的主题是获取下厨房网站月度最佳栏目近十年数据最终进行数据清洗、处理后生成所需的数据库表最终进行数据可视化。用到的技术栈有Python网络爬虫、数据分析、Scala引擎、Flask框架等其中会重点讲解使用Scala数据处理的过程其他步骤则是一笔带过。
源数据获取 首先是源数据地址网站来源于下厨房 (xiachufang.com)查看网站情况如下 可以看见本次的数据源是下厨房网站里面的月度最佳栏目该栏目有2011年3月到至今2023年10月的连续数据其中每个月有50道当月最受欢迎菜品每个菜谱点进去后不仅有菜名、详细用料等还贴出具体步骤。 写Python代码爬取数据 如图利用所学知识编写爬虫代码对网站进行解析并爬取数据最后经过简单处理后存储至MySQL数据库并另存为csv表格留档本次只获取了2015年5月至2023年10月近10年的数据 可以看见获取的数据总共有十个字段有菜名、链接、做法等信息其中foods_id、收藏人数、最佳年月字段是整型其余字段都是文本类型 Scala介绍与数据处理 1.Sacla介绍 Scala是一种通用的编程语言它结合了面向对象编程和函数式编程的特点并且在大数据处理领域被广泛使用。 Scala最初于2003年由Martin Odersky教授开发并于2004年首次发布。Scala在Java虚拟机JVM上运行可以与Java互操作并且可以直接使用Java的库和工具。 Scala的主要特点包括 静态类型系统Scala是一种静态类型的语言这意味着在编译时会进行类型检查减少运行时错误。 面向对象和函数式编程Scala支持面向对象编程可以使用类、继承和多态等概念。同时Scala也支持函数式编程提供了高阶函数、匿名函数和不可变数据结构等特性。 表达力强大Scala具有强大而灵活的语法可以用更少的代码实现复杂的任务。它提供了模式匹配、高级类型推断和代数数据类型等功能使编程变得更加简洁和易读。 并发编程支持Scala内置了并发编程库提供了可以简化并发编程的抽象和工具。其中最著名的是Akka框架它提供了基于消息传递的并发模型。 在大数据处理领域Scala通常与Apache Spark搭配使用。Spark是一个快速、通用的大数据处理引擎Scala是其主要支持的编程语言之一。借助Scala的强大特性和Spark的分布式计算能力开发人员可以编写高效、可扩展的大数据处理应用程序。 总而言之Scala是一种强大的编程语言特别适用于大数据处理和并发编程。它结合了面向对象和函数式编程的优点并且在大数据处理领域有着广泛的应用和影响。 2.Scala数据处理流程 现在数据库已经有了源数据接下来就是进行数据处理了。这里我选择的技术是Scala引擎不熟悉的小伙伴可以上网查看该技术的语法格式和注意事项我就不进行过多描述直接进行代码解读。首先要明确处理的目标和步骤通过查看数据我设立了5个指标附上指标说明和代码 代码前文mysql_da是数据库源数据de_Data是根据菜名去重后的数据 1 作者菜谱及收藏总量 这里对去重后的数据根据作者id进行分组然后聚合行数即为菜品数量、聚合收藏人数即为中收藏数量最后调用write方法将处理后的数据存储到新的数据表和Hadoop集群的hdfs组件 //1 查询数据源里面属于一个作者的菜品和总收藏量有多少保存前100个作者存储下来val num_foods de_Data.groupBy(作者id).agg(functions.count(*).alias(菜品数量),functions.sum(收藏人数).alias(总收藏数量)).sort(functions.desc(菜品数量)).limit(100)//打印看看结果是否出来num_foods.show();System.out.println(*************菜谱数量top100*********)//存储至本地数据库num_foods.write.mode(SaveMode.Overwrite).jdbc(url, foods_num, prop)//存储到hdfsnum_foods.write.format(parquet).option(header, true).option(encoding, UTF-8).mode(overwrite).save(hdfs://20210322045-master:9000/term_data/foods_num) 2 历年收藏Top10 首先对最佳年月字段进行处理将其转换为年份并创建临时视图foods_with_year。接着使用SQL语句查询不同年份中收藏人数最多的前10道菜并生成临时视图year_tab1。最后从临时视图year_tab1中选取字段并按年份升序、收藏人数降序排序并展示前100行结果。将结果数据保存至本地数据库和HDFS中。 //2 查询数据里面不同年份最多收藏人数的前10菜品// 将最佳年月字段转换为年份System.out.println(做到第二题了)val de_year de_Data.withColumnRenamed(收藏人数, sl)de_year.createOrReplaceTempView(foods)spark.sql(SELECT *, CAST(SUBSTRING(最佳年月, 1, 4) AS int) as year FROM foods).createOrReplaceTempView(foods_with_year)// 查询不同年份中收藏人数最多的前10道菜val year spark.sql(SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY year ORDER BY sl desc ) AS rank_no FROM foods_with_year ) tmp WHERE rank_no 10 )//分两步进行sql查询第一步是开窗函数进行分组统计第二步是根据年份和收藏人数排序year.createOrReplaceTempView(year_tab1)val foods_year spark.sql(select year, 菜名,用料食材和数量, 链接地址, 作者id, sl,rank_no from year_tab1 order by year asc, sl desc)foods_year.show(100, false)//存储至本地数据库foods_year.write.mode(SaveMode.Overwrite).jdbc(url, foods_year, prop)//存储到hdfsfoods_year.write.format(parquet).option(header, true).option(encoding, UTF-8).mode(overwrite).save(hdfs://20210322045-master:9000/term_data/foods_year) 3 历年收藏Top10 首先根据创建时间添加了一个名为“季节”的字段根据不同的月份范围为每个菜品添加上了对应的季节信息然后修改了字段名为“season”以方便后续处理。 使用窗口函数在每个季节内按收藏人数进行降序排名并取出每个季节收藏数量排名前5的菜品将结果存储在名为“data_jj1”的DataFrame中。 将结果数据分别保存至本地数据库和HDFS中。在保存至本地数据库时使用了覆盖的保存模式。 //3 根据创建时间再添加一个字段季节比如3-5月是春季6-8是夏季~//根据季节来进行分组计数计算出每个季节收藏数量排名前5的菜品// 添加季节字段var data_jj de_Data.withColumn(季节, functions.when(month(col(创建时间)).between(3, 5), 春季).when(month(col(创建时间)).between(6, 8), 夏季).when(month(col(创建时间)).between(9, 11), 秋季).otherwise(冬季))// 把季节改成英文方便开窗函数运行data_jj data_jj.withColumnRenamed(季节, season)data_jj data_jj.withColumnRenamed(收藏人数, sl)data_jj.createTempView(data_jj)val windowSpec Window.partitionBy(season).orderBy(functions.desc(sl))val data_jj1 data_jj.withColumn(rank_no, row_number.over(windowSpec)).orderBy(expr(CASE season WHEN 春季 THEN 1 WHEN 夏季 THEN 2 WHEN 秋季 THEN 3 WHEN 冬季 THEN 4 ELSE 5 END), col(rank_no)).filter(col(rank_no).leq(5))System.out.println(*************每个季节收藏数量排名前5的菜品*********)// 将数据存储到本地数据库和hdfs集群//保存模式为覆盖data_jj1.write.mode(SaveMode.Overwrite).jdbc(url, foods_season, prop)//存储到hdfsdata_jj.write.format(parquet).option(header, true).option(encoding, UTF-8).mode(overwrite).save(hdfs://20210322045-master:9000/term_data/foods_season) 4 历年收藏Top10 将数据加载到临时视图ws_data中以便后续查询操作。使用SQL语句进行查询按照年份对每个作者的收藏数量进行汇总并按收藏数量降序排名。取每年收藏数量前3的作者和总收藏量数据将结果保存在名为foods_with_year的临时视图中。从foods_with_year视图中查询结果并展示。将结果数据保存至本地数据库并使用覆盖的保存模式。将结果数据保存至HDFS中数据格式为parquet并使用覆盖的保存模式。 //4每年收藏数量前3的作者和总收藏量mysql_da.createTempView(ws_data)spark.sql(SELECT 最佳年月, 作者id, 年收藏量\n FROM (\n SELECT 最佳年月, 作者id, SUM(收藏人数) AS 年收藏量,\n ROW_NUMBER() OVER(PARTITION BY FLOOR(最佳年月 / 100) ORDER BY Max(收藏人数) DESC) AS 排名\n FROM ws_data\n GROUP BY 最佳年月, 作者id\n ) AS subquery\n WHERE 排名 3\n ORDER BY 最佳年月,排名).createOrReplaceTempView(foods_with_year)val fsj spark.sql(SELECT CAST(SUBSTRING(最佳年月, 1, 4) AS int) as 年份 ,作者id, 年收藏量 FROM foods_with_year)fsj.show()//存储至本地数据库fsj.write.mode(SaveMode.Overwrite).jdbc(url, foods_nszl, prop)//存储到hdfsfsj.write.format(parquet).option(header, true).option(encoding, UTF-8).mode(overwrite).save(hdfs://20210322045-master:9000/term_data/foods_nscl) 5 历年收藏Top10 将数据加载到临时视图ws_data1中为后续查询做准备。使用SQL语句查询每个最佳年月的作者的年收藏量并按照排名进行排序将结果保存在名为foods_zly的临时视图中。从foods_zly视图中提取年份、作者ID和年收藏量的数据。计算每年的总收藏人数增长趋势包括计算增长率并展示结果。将结果数据保存至本地数据库中并使用覆盖的保存模式。将结果数据保存至HDFS中数据格式为parquet并使用覆盖的保存模式。 //5.每年的收藏率趋势mysql_da.createTempView(ws_data1)// 查询每个最佳年月的作者的年收藏量并按照排名进行排序spark.sql(SELECT 最佳年月, 作者id, SUM(收藏人数) AS 年收藏量,\n ROW_NUMBER() OVER(PARTITION BY FLOOR(最佳年月 / 100) ORDER BY MAX(收藏人数) DESC) AS 排名\n FROM ws_data1\n GROUP BY 最佳年月, 作者id\n ORDER BY 最佳年月,排名).createOrReplaceTempView(foods_zly)// 提取年份、作者ID和年收藏量val zzl spark.sql(SELECT CAST(SUBSTRING(最佳年月, 1, 4) AS int) AS 年份, 作者id, 年收藏量 FROM foods_zly)// 计算每年的总收藏人数增长趋势var trend zzl.groupBy(年份).agg(sum(年收藏量).as(总收藏人数)).orderBy(年份)// 计算增长率val windowSpec1 Window.orderBy(年份)trend trend.withColumn(前一年收藏人数, lag(总收藏人数, 1).over(windowSpec1)).withColumn(增长率,round(expr((cast(总收藏人数 as double) / cast(前一年收藏人数 as double)) - 1), 2)).drop(前一年收藏人数)trend.show()trend.write.mode(SaveMode.Overwrite).jdbc(url, foods_zzl, prop)//存储到hdfstrend.write.format(parquet).option(header, true).option(encoding, UTF-8).mode(overwrite).save(hdfs://20210322045-master:9000/term_data/foods_zzl)
查看处理后的数据 foods_year foods_season foods_num foods_zzl foods_nszl 数据可视化 最后是数据可视化展示用python将Spark处理存储到数据库的数据读取并且将其加工成所需类型后转成json格式供后面大屏读取用下面是部分处理代码 随后新建html文件在里面添加各项依赖后在script标签里面添加一下Echarts的配置项并用Ajax技术读取刚才处理好的json文件传入给配置项后即可在通过Flask框架在网页上渲染出数据大屏 最终大屏效果 小结 项目到这里就算是完成了做的时候其实涉及到的技术栈还是蛮多的虽然都不是很深但是途中也遇到了各种各样的困难。特别是用Scala技术进行数据处理时由于对语法的不熟悉报了很多错、还有数据库数据的格式和提取转换难点等问题。后面都一一解决了 这次的项目让我得到了成长和提升让我也对所学知识进行了学以致用融会贯通。 最后感谢给我传授知识的广林哥、川哥等老师祝你们家庭和睦工作顺利。
文章转载自: http://www.morning.stbfy.cn.gov.cn.stbfy.cn http://www.morning.nwcgj.cn.gov.cn.nwcgj.cn http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.newfeiya.com.cn.gov.cn.newfeiya.com.cn http://www.morning.frpm.cn.gov.cn.frpm.cn http://www.morning.swkzr.cn.gov.cn.swkzr.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.frmmp.cn.gov.cn.frmmp.cn http://www.morning.kttbx.cn.gov.cn.kttbx.cn http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn http://www.morning.bhdyr.cn.gov.cn.bhdyr.cn http://www.morning.tnbas.com.gov.cn.tnbas.com http://www.morning.frpm.cn.gov.cn.frpm.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.wlqbr.cn.gov.cn.wlqbr.cn http://www.morning.lgznf.cn.gov.cn.lgznf.cn http://www.morning.bqdgr.cn.gov.cn.bqdgr.cn http://www.morning.qcfcz.cn.gov.cn.qcfcz.cn http://www.morning.yqndr.cn.gov.cn.yqndr.cn http://www.morning.hpkgm.cn.gov.cn.hpkgm.cn http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.fygbq.cn.gov.cn.fygbq.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.yrhpg.cn.gov.cn.yrhpg.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.ljhnn.cn.gov.cn.ljhnn.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.fksdd.cn.gov.cn.fksdd.cn http://www.morning.tzkrh.cn.gov.cn.tzkrh.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.rfldz.cn.gov.cn.rfldz.cn http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.dtrz.cn.gov.cn.dtrz.cn http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn http://www.morning.yrycb.cn.gov.cn.yrycb.cn http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.lmrcq.cn.gov.cn.lmrcq.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.qcfgd.cn.gov.cn.qcfgd.cn http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.rydhq.cn.gov.cn.rydhq.cn http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn http://www.morning.bzlsf.cn.gov.cn.bzlsf.cn http://www.morning.qbnfc.cn.gov.cn.qbnfc.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.nzmqn.cn.gov.cn.nzmqn.cn http://www.morning.byrlg.cn.gov.cn.byrlg.cn http://www.morning.lgphx.cn.gov.cn.lgphx.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.lzzqz.cn.gov.cn.lzzqz.cn http://www.morning.uycvv.cn.gov.cn.uycvv.cn http://www.morning.fewhope.com.gov.cn.fewhope.com http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.rxsgk.cn.gov.cn.rxsgk.cn http://www.morning.dmtld.cn.gov.cn.dmtld.cn http://www.morning.bnjnp.cn.gov.cn.bnjnp.cn http://www.morning.wrqw.cn.gov.cn.wrqw.cn http://www.morning.0small.cn.gov.cn.0small.cn http://www.morning.jfcbz.cn.gov.cn.jfcbz.cn http://www.morning.lylkh.cn.gov.cn.lylkh.cn http://www.morning.szzxqc.com.gov.cn.szzxqc.com http://www.morning.ksqzd.cn.gov.cn.ksqzd.cn http://www.morning.pyswr.cn.gov.cn.pyswr.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn http://www.morning.rxydr.cn.gov.cn.rxydr.cn