Spark RDD案例(四)IP和地理位置映射统计

Pyspark实战与广播变量broadcast的应用 1 Spark-core案例 IP统计 学习目标 应用RDD实现ip地址查询案例 记忆广播变量的概念 1 通过RDD实现ip地址查询 需求 在互联网中,我们经常会见到城市热点图这样的报表数据,例如在百度统计中,会统计今年的热门旅游城市、热门报考学校等,会将这样的信息显示在热点图中。 因此,我们需要通过日志信息(运行商或者网站自己生成)和城市ip段信息来判断用户的ip段,统计热点经纬度。 ip日志信息 在ip日志信息中,我们只需要关心ip这一个维度就可以了,其他的不做介绍 思路 1、 加载 阅读详情

Spark RDD案例(四)IP和地理位置映射统计

1. 背景

  1. Spark作为大数据分析引擎,本身可以做离线和准实时数据处理
  2. Spark抽象出的操作对象如RDD、dataSet、dataFrame、DStream等都是高层级的抽象,屏蔽了分布式数据处理代码细节,操作分布式数据和处理就像使用scala集合接口一样便利。这样可以很大降低编程使用和理解门槛。
  3. 在实际生产中,大数据处理面临的业务需求和正常java 业务需求一样,都是基于数据做处理。不同的是正常java业务数据相对较少,如mysql中适合存储的数据是小而美的如500万行数据及以下,而大数据存储500万行才达到海量数据存储的门槛。
  4. 实际生产中,大数据和小批量Java数据处理需求往往类似,如需要根据已知规则确定手中数据的对应信息,涉及到一个查找过程。在sql中一般是join的方式来将信息匹配映射,但是在spark中一般采用逐条处理并从已知规则中匹配方式
  5. 当所需要查找的规则数据集合相对小时,一般采用广播变量将数据分发到各个executor上,这样类似于mapreduce的分布式缓存,可以降低大量的数据传输和处理损耗。

2. 案例

  1. 需求
    需要将日志中ip地址提取出来,查找出ip对应的省信息,并作次数统计
  2. 数据
  • ip规则数据
1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.0.32.0|1.0.63.255|16785408|16793599|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.1.0.0|1.1.0.255|16842752|16843007|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.2.0|1.1.7.255|16843264|16844799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.8.0|1.1.63.255|16844800|16859135|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.2.0.0|1.2.1.255|16908288|16908799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.2.2.0|1.2.2.255|16908800|16909055|亚洲|中国|北京|北京|海淀|北龙中网|110108|China|CN|116.29812|39.95931
1.2.4.0|1.2.4.255|16909312|16909567|亚洲|中国|北京|北京||中国互联网信息中心|110100|China|CN|116.405285|39.904989
1.2.5.0|1.2.7.255|16909568|16910335|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.2.8.0|1.2.8.255|16910336|16910591|亚洲|中国|北京|北京||中国互联网信息中心|110100|China|CN|116.405285|39.904989
1.2.9.0|1.2.127.255|16910592|16941055|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.3.0.0|1.3.255.255|16973824|17039359|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.4.1.0|1.4.3.255|17039616|17040383|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.4.4.0|1.4.4.255|17040384|17040639|亚洲|中国|北京|北京|海淀|北龙中网|110108|China|CN|116.29812|39.95931
1.4.5.0|1.4.7.255|17040640|17041407|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.4.8.0|1.4.127.255|17041408|17072127|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.8.0.0|1.8.255.255|17301504|17367039|亚洲|中国|北京|北京|海淀|北龙中网|110108|China|CN|116.29812|39.95931
  • 日志数据
20090121000132095572000|125.213.100.123|show.51.com|/shoplist.php?phpfile=shoplist2.php&style=1&sex=137|Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0(Compatible Mozilla/4.0(Compatible-EmbeddedWB 14.59 http://bsalsa.com/ EmbeddedWB- 14.59  from: http://bsalsa.com/ )|http://show.51.com/main.php|
20090121000132124542000|117.101.215.133|www.jiayuan.com|/19245971|Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler 4.0)|http://photo.jiayuan.com/index.php?uidhash=d1c3b69e9b8355a5204474c749fb76ef|__tkist=0; myloc=50%7C5008; myage=2009; PROFILE=14469674%3A%E8%8B%A6%E6%B6%A9%E5%92%96%E5%95%A1%3Am%3Aphotos2.love21cn.com%2F45%2F1b%2F388111afac8195cc5d91ea286cdd%3A1%3A%3Ahttp%3A%2F%2Fimages.love21cn.com%2Fw4%2Fglobal%2Fi%2Fhykj_m.jpg; last_login_time=1232454068; SESSION_HASH=8176b100a84c9a095315f916d7fcbcf10021e3af; RAW_HASH=008a1bc48ff9ebafa3d5b4815edd04e9e7978050; COMMON_HASH=45388111afac8195cc5d91ea286cdd1b; pop_1232093956=1232468896968; pop_time=1232466715734; pop_1232245908=1232469069390; pop_1219903726=1232477601937; LOVESESSID=98b54794575bf547ea4b55e07efa2e9e; main_search:14469674=%7C%7C%7C00; registeruid=14469674; REG_URL_COOKIE=http%3A%2F%2Fphoto.jiayuan.com%2Fshowphoto.php%3Fuid_hash%3D0319bc5e33ba35755c30a9d88aaf46dc%26total%3D6%26p%3D5; click_count=0%2C3363619
20090121000132406516000|117.101.222.68|gg.xiaonei.com|/view.jsp?p=389|Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CIBA)|http://home.xiaonei.com/Home.do?id=229670724|_r01_=1; __utma=204579609.31669176.1231940225.1232462740.1232467011.145; __utmz=204579609.1231940225.1.1.utmccn=(direct)
  1. 环境准备
  • idea 202
  • mave 3.6.3
  • pom文件
<!-- 定义了一些常量 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <scala.version>2.12.10</scala.version>
        <spark.version>3.0.1</spark.version>
        <hbase.version>2.2.5</hbase.version>
        <hadoop.version>3.2.1</hadoop.version>
        <encoding>UTF-8</encoding>
    </properties>

    <dependencies>
        <!-- 导入scala的依赖 -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
            <!-- 编译时会引入依赖,打包是不引入依赖 -->
            <!--            <scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.12</version>
        </dependency>


        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
            <!-- 编译时会引入依赖,打包是不引入依赖 -->
            <!--            <scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <!-- 编译scala的插件 -->
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <!-- 编译java的插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- 打jar插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  • jdk 1.8
  • scala 2.12.12
  1. 代码
package com.doit.day07

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ArrayBuffer


/*
* 有一堆log日志文件,其中包含ip地址
* 有一个ip地址和位置信息规则文件
*
* 需求是希望可以统计出每条日志ip的实际位置信息,以及对应次数。地理位置精确到省份即可
* */
object IPLocation1 {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setAppName("IPLocation1")
      .setMaster("local[*]")

    val sc = new SparkContext(conf)

    /*
    * 1.2.0.0|1.2.1.255|16908288|16908799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
    * */
    // 先读取ip规则文件,转换,
    val rdd1: RDD[String] = sc.textFile("E:\\DOITLearning\\12.Spark\\ip_location_dict.txt")

    // 对ip规则数据做转换,注意要去重,防止重复数据
    val ipRulesInDriver: Array[(Long, Long, String, String)] = rdd1.map(line => {
      val strings: Array[String] = line.split("\\|")

      val startIP = strings(2).toLong
      val endIP = strings(3).toLong
      val provinceStr: String = strings(6)

      // 为了方便排序和查找,转为long类型,然后是省份信息
      (startIP, endIP, provinceStr, strings(7))
    }).sortBy(_._1).collect()
    println("ipRulesInDriver: " + ipRulesInDriver.toBuffer)

    // 将去重,排序之后的ip规则信息设置为广播变量
    val broadcastRefInDriver: Broadcast[Array[(Long, Long, String, String)]] = sc.broadcast(ipRulesInDriver)

    /*
    * 20090121000132095572000|125.213.100.123|show.51.com
    * |/shoplist.php?phpfile=shoplist2.php&style=1&sex=137
    * |Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0(Compatible Mozilla/4.0(Compatible-EmbeddedWB 14.59 http://bsalsa.com/ EmbeddedWB- 14.59  from: http://bsalsa.com/ )
    * |http://show.51.com/main.php|
    * */
    // 读取日志文件,然后将日志文件中IP解析出来,通过广播变量的ip规则信息,查找到ip对象的省信息
    val logRDD: RDD[String] = sc.textFile("E:\\DOITLearning\\12.Spark\\ipaccess.log")

    val resRDD: RDD[(String, Int)] = logRDD.map(f = line => {

      val strings: Array[String] = line.split("\\|")
      val ipStr: String = strings(1)

      val ipNumber: Long = IPUtils.ip2Long(ipStr)

      val ipRulesInExecutor: Array[(Long, Long, String, String)] = broadcastRefInDriver.value

      // 查找这个ip对应的省
      val ipIndex: Int = IPUtils.binarySearchIpAndLocation(ipRulesInExecutor, ipNumber)

      // 说明找到了
      var ipProvince: String = "null"
      if (ipIndex > -1) {
        ipProvince = ipRulesInExecutor(ipIndex)._3
      }

      (ipProvince, 1)
    }).reduceByKey(_ + _)

    println("resRDD: " + resRDD.collect().toBuffer)

    sc.stop()
  }
}

object IPUtils {
  def ip2Long(ip: String): Long = {
    val ipFragments: Array[String] = ip.split("\\.")
    var ipNumber = 0L

    // 其实就可以把ip地址看成是由8位bit组成的数字,刚好最大是255,
    // 这时候可以将最开始位置的数字左移24位,第二位左移16位,第三位左移8位,最后一个数字不移动,最后组成起来就是一个32位正整数的bit形式
    // return (Long.parseLong(ipFragments[0]) << 24) + (Long.parseLong(ipFragments[1]) << 16) + (Long.parseLong(ipFragments[2]) << 8) + Long.parseLong(ipFragments[3]);
    for (i <- 0 until ipFragments.length) {
      // 这里相当于第一个ip段循环向左移动了三次,第二个移动了2次,第三个移动了1次,每次都是8bit位
      ipNumber = ipFragments(i).toLong | ipNumber << 8L
    }

    ipNumber
  }

  // 二分查找,注意前提是数据需要有序,默认是升序排列,本实现也是升序排列
  def binarySearchIpAndLocation(infoArray: Array[(Long, Long, String, String)], ip: Long): Int = {

    var lowIndex = 0
    var highIndex = infoArray.length - 1

    while (lowIndex <= highIndex) {

      // 中间位置的数组序号
      val middleIndex = (lowIndex + highIndex) / 2

      // 如果要查找的ip地址刚好在middle序号对应的位置上,则ip段起始整数,ip段结束整数会刚好把这个ip包含起来
      if ((ip >= infoArray(middleIndex)._1) && (ip <= infoArray(middleIndex)._2)) {
        return  middleIndex
      } else if (ip < infoArray(middleIndex)._1) {
        // 数据在上半部分
        highIndex = middleIndex - 1
      } else {
        // 数据在下半部分
        lowIndex = middleIndex + 1
      }
    }

    // 没有找到
    -1
  }

  def binarySearchIpAndLocation(infoArray: ArrayBuffer[(Long, Long, String, String)], ip: Long): Int = {

    var lowIndex = 0
    var highIndex = infoArray.length - 1

    while (lowIndex <= highIndex) {

      // 中间位置的数组序号
      val middleIndex = (lowIndex + highIndex) / 2

      // 如果要查找的ip地址刚好在middle序号对应的位置上,则ip段起始整数,ip段结束整数会刚好把这个ip包含起来
      if ((ip >= infoArray(middleIndex)._1) && (ip <= infoArray(middleIndex)._2)) {
        return middleIndex
      } else if (ip < infoArray(middleIndex)._1) {
        // 数据在上半部分
        highIndex = middleIndex - 1
      } else {
        // 数据在下半部分
        lowIndex = middleIndex + 1
      }
    }

    // 没有找到
    -1
  }
}

注意,二分查找的代码,找到middle index符合条件时,记得return 返回,需要让数据返回并且结束方法,否则会一直卡住
整个查找过程中,首先加载ip和省市对应的字典信息,并且采集回driver端,然后使用广播变量方式分发到各个executor端
加载日志数据之后,map方法逐条处理,查找,这时候就发生了闭包,广播变量被闭包捕获,然后map内部代码会以task方式被序列化之后,发送executor执行。
具体源码如下在这里插入图片描述

【信息科学与工程学】计算机科学与自动化——第四篇 信息系统开发知识基础——11 分布式感知能力的主流存储系统与数据库软件 ​​。 阅读详情

相关推荐

【信息科学与工程学】【安全领域】第十二篇 简述数据安全体系与保密技术

设计一个自适应窗口调整算法,本质上是为您的系统装备一个能够感知环境、智能决策的“自动驾驶”模式。核心在于明确您的核心目标(是优先延迟还是精度),然后据此精心设计触发条件和调整策略。

weixin_49199313的博客 1780

带你入门GeoSpark系列之二【Spatial RDD篇】

系列目录 带你入门GeoSpark系列之一【环境篇】 带你入门GeoSpark系列之二【Spatial RDD篇】 带你入门GeoSpark系列之三【SQL&空间查询&索引篇】 1、基本地理数据概念 GeoSpark本质还是对地理要素进行操作,所以它支持了常用的一些地学几何图形。 几何图形中主要有三个要素:点,线,面。 横纵坐标构成点,多个点构成线,环线构成面,点线面混合构成几何集...

SUDDEV的博客 4264

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇02

但若第一个应用需求40GB/s,第二个10GB/s,总需求50GB/s>40GB/s,第一个得32GB/s,第二个得8GB/s,不公平。但若分区负载不均(分区1-2各有100任务/s,分区3-4各有50任务/s),A负责1-2(200/s),B负责3-4(100/s),仍均衡。任务 τi​ 的计算需求 Wi​(CPU周期),在频率 f 下执行时间 Ti​=Wi​/f,能耗 Ei​=Pdyn​⋅Ti​=Ceff​⋅V2⋅f⋅(Wi​/f)=Ceff​⋅V2⋅Wi​。若 Mneed​>Mi​,需使用远程显存。

weixin_49199313的博客 107

Spark RDD案例(五)经纬度转换为地理位置

Spark RDD案例(五)经纬度转换为地理位置 1. 背景 Spark作为大数据分析引擎,本身可以做离线和准实时数据处理 Spark抽象出的操作对象如RDD、dataSet、dataFrame、DStream等都是高层级的抽象,屏蔽了分布式数据处理代码细节,操作分布式数据和处理就像使用scala集合接口一样便利。这样可以很大降低编程使用和理解门槛。 在实际生产中,大数据处理面临的业务需求和正常java 业务需求一样,都是基于数据做处理。不同的是正常java业务数据相对较少,如mysql中适合存储的数据是

xiaohu21的博客 1522

统计ip地址的所属省份的spark程序,并将处理的结果数据存储到mysql数据库中所用的资料

统计ip地址的所属省份的spark程序,并将处理的结果数据存储到mysql数据库中

高分辨率航拍图像的目标检测切图优化策略

本文深入探讨了高分辨率航拍图像目标检测中的切图优化策略。针对大尺寸图像直接缩放导致小目标信息丢失的问题,文章详细阐述了基于重叠切割的核心方法,包括如何根据目标尺寸确定切图尺寸与重叠率,并提供了从切图到坐标还原的完整代码实现与避坑指南,有效提升检测精度与效率。

xk7n92h3p5m的博客 1113

用Spark和DBSCAN对地理定位数据进行聚类

如何利用机器学习和分布式计算来对用户事件进行聚类

OReillyData 1953

通达信强龙趋势幅图指标:从强弱分析到买卖点实战指南

在股票技术分析中,趋势判断一直是交易决策的核心环节。传统指标通常依赖均线交叉或MACD金叉来确认趋势,但这种确认机制天然存在滞后性,往往等信号明确时行情已走过大半。针对这一问题,基于价格位置、量能配合和均线结构三个维度综合打分的思想逐渐受到关注,通过量化个股所处强弱区间,帮助投资者更快识别强势股与风险信号。这类强弱分析工具不仅适用于刚接触公式编辑的新手,也能为有经验的交易者提供一把可视化的“强度刻度尺”。在实际应用中,结合回踩低吸、离场判断等交易场景,能够有效提升买卖点的把握能力。本文详细解析通达信强龙趋势

weixin_29044157的博客 326

spark例子ip归属地查询

package cn.smart.spark import java.sql.{Connection, Date, DriverManager, PreparedStatement} import org.apache.spark.{SparkConf, SparkContext} /** * Created by Mr.Smart on 2018-05-24. */ object I...

Smart_cxr的博客 538

低功耗基础概念——Level Shifter cell补充

信号跨越不同级别电压模块进行驱动时,需要使用level shifter。 H2L Level shifer 从高电压到低电压的level shifter,可以是两个反相器的串联。 输入高电平区域信号INH,输出低电平区域信号OUTL,注意供应电源由低电压模块提供,即图中的VDDL。 从图中可以看出,H2L的level shifter只会引入一个buffer的延迟,对时序的影响较小。 L2H Level shifer 用低电压区域的信号invert和buffer之后得到的一对信号来驱动工作在高电压区域的交

qq_36480087的博客 1万+

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 678

Spark中处理业务并写入mysql

数据样本 ip.txt 1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302 1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178 1.0.32.0|...

Gorilla的博客 1215

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

计算机毕业设计hadoop+spark+hive考研院校推荐系统 考研分数线预测系统 大数据毕业设计 (代码+LW文档+PPT+讲解视频)

计算机毕业设计hadoop+spark+hive考研院校推荐系统 考研分数线预测系统 大数据毕业设计 (代码+LW文档+PPT+讲解视频)

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 807

手把手教你从入门到精通C#串口通信

本文以我开发的串口助手SComTool为例,详细介绍《C#串口通信从入门到精通》专栏的目录内容,本专栏由一个高级工程师多年实战经验总结,绝对是c#串口通信的葵花宝典!带您从入门到精通C#串口通信!

qq_34059233的博客 3万+

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

计算机毕业设计Python+Spark+Hadoop美食推荐系统 美食可视化 大数据毕业设计 (源码+文档+PPT+讲解)

计算机毕业设计Python+Spark+Hadoop美食推荐系统 美食可视化 大数据毕业设计 (源码+文档+PPT+讲解)

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 1844

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机毕业设计hadoop+spark+hive考研分数线预测 考研推荐系统 大数据毕业设计(源码+LW文档+PPT+讲解)

摘要:本文提出基于Hadoop+Spark+Hive的考研分数线预测系统,通过分布式架构整合多源数据,构建包含20个特征的特征工程,采用ARIMA、XGBoost、LSTM等模型融合预测。实验结果显示预测MAE误差为2.9分,较传统方法降低40%。系统具备实时响应能力(200ms内更新结果)和可解释性(展示关键影响因素),为考生、高校和教育机构提供智能决策支持。未来将探索多模态数据融合和实时预测技术扩展应用场景。

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 752

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: HttpClient 使用简单案例(scala 版本)
下一篇: 高德地图开放平台概览
闻香识代码
博客等级 码龄12年 314粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值