spark学习02之app流量统计并排序(JAVA)

计算出用户上网流量总流量(上行+下行)最高的网站Top3 分析用户访问网站日志,计算出上网总流量前3名的网站名及总流量 日志部分如下(电话号,URL,上行量,下行量) 13026230503 http://v.baidu.com/tv 20 5000 13826544101 http://www.weibo.com/?category=7 20 5000 13926435656 http://v.baidu.com/tv 20 ... 阅读详情

      转载自龙果学院的视频http://www.roncoo.com/course/view/1af3e9867cb84263a2a1873880205ae1。

     有这样一份log日志记录了某时间戳下某个设备访问网站时产生的上行流量、下行流量。

时间戳/设备号/上行流量/下行流量



       现在想统计出每个设备号的最早访问时间及总的上行流量、下行流量,最后打印出10个按上行流量、下行流量排序的最多的10个记录。

    

    创建个普通的maven项目。


pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.fei</groupId>
  <artifactId>spark-appTrafficCount</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
     <dependency>
	  <groupId>org.apache.spark</groupId>
	  <artifactId>spark-core_2.10</artifactId>
	  <version>1.3.0</version>
	</dependency>
	
	
	
  </dependencies>
  
</project>
  写个DataFileGenerator.java模拟日志数据,并写入文件,便于后面spark读取文件

package com.fei;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;

/**
 * 模拟生成数据,并把数据写到文件中
 * 文件内容:
 * 时间戳 \t设备号\t上行流量\t下行流量
 * @author Jfei
 *
 */
public class DataFileGenerator {

	public static void main(String[] args) {
		//1.生成100个设备号
		List<String> deviceIds = new ArrayList<String>();
		for(int i=0;i<100;i++){
			deviceIds.add(getDeviceId());
		}
		
		//2.生成1000个时间戳,该时间戳对应的设备号及上行流量、下行流量
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<1000;i++){
			long timestamp = System.currentTimeMillis() - random.nextInt(10000);
			//随机获取一个设备号
			String deviceId = deviceIds.get(random.nextInt(100));
			//上行流量
			long upTraffic = random.nextInt(10000);
			//下行流量
			long downTraffic = random.nextInt(10000);
			
			sb.append(timestamp).append("\t").append(deviceId).append("\t").append(upTraffic)
			    .append("\t").append(downTraffic).append("\n");
		}
		
		//将数据写到文件
		PrintWriter pw = null;
		try {
			pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("e:\\app-log.txt")));
			pw.write(sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(pw != null){
				pw.close();
			}
		}
		
	}
	
	private static String getDeviceId(){
		return UUID.randomUUID().toString().replace("-", "");
	}
}
  写个AccessLogInfo.java对应文件中的时间戳/上行流量/下行流量

package com.fei;

import java.io.Serializable;

/**
 * 设备(deviceId)访问日志信息对象,对应app-log.txt里面的内容
 * 
 * 因为后面是要将这对象放到spark中处理的,所以必须序列化
 * @author Jfei
 *
 */
public class AccessLogInfo implements Serializable{

	private static final long serialVersionUID = 1L;
    //没有设备号,是因为这对象是站在设备角度看的,k-v形式<设备号,AccessLogInfo>
	
	private long timestamp;//时间戳
	private long upTraffic;//上行流量
	private long downTraffic;//下行流量
	
	public AccessLogInfo(){
		
	}
	
	public AccessLogInfo(long timestamp, long upTraffic, long downTraffic) {
		this.timestamp = timestamp;
		this.upTraffic = upTraffic;
		this.downTraffic = downTraffic;
	}
	
	public long getTimestamp() {
		return timestamp;
	}
	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}
	public long getUpTraffic() {
		return upTraffic;
	}
	public void setUpTraffic(long upTraffic) {
		this.upTraffic = upTraffic;
	}
	public long getDownTraffic() {
		return downTraffic;
	}
	public void setDownTraffic(long downTraffic) {
		this.downTraffic = downTraffic;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	
	
}

  因为有排序要求,而上面的AccessLogInfo.java是没有定义排序比较的,所以定义个AccessLogSortKey.java

package com.fei;

import java.io.Serializable;

import scala.math.Ordered;
/**
 * 可排序的对象,上行流量、下行流量、时间戳来排序,降序
 * @author Jfei
 *
 */
public class AccessLogSortKey implements Ordered<AccessLogSortKey>,Serializable{

	private static final long serialVersionUID = 1L;

	private long timestamp;//时间戳
	private long upTraffic;//上行流量
	private long downTraffic;//下行流量
	
	public AccessLogSortKey(){
		
	}
	
	public AccessLogSortKey(long timestamp, long upTraffic, long downTraffic) {
		this.timestamp = timestamp;
		this.upTraffic = upTraffic;
		this.downTraffic = downTraffic;
	}

	public boolean $greater(AccessLogSortKey other) {
		if(upTraffic > other.upTraffic){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic > other.downTraffic	){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic == other.downTraffic && timestamp > other.timestamp	){
			return true;
		}
		
		return false;
	}

	public boolean $greater$eq(AccessLogSortKey other) {
		if($greater(other)){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic == other.downTraffic && timestamp == other.timestamp){
			return true;
		}
		return false;
	}
	public boolean $less(AccessLogSortKey other) {
		
		if(upTraffic < other.upTraffic){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic < other.downTraffic	){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic == other.downTraffic && timestamp < other.timestamp	){
			return true;
		}
		
		return false;
	}

	public boolean $less$eq(AccessLogSortKey other) {
		if($less(other)){
			return true;
		}else if(upTraffic == other.upTraffic && downTraffic == other.downTraffic && timestamp == other.timestamp){
			return true;
		}
		return false;
	}

	public int compare(AccessLogSortKey other) {
		if(upTraffic - other.upTraffic != 0){
			return (int)(upTraffic - other.upTraffic);
		}
		if(downTraffic - other.downTraffic != 0){
			return (int)(downTraffic - other.downTraffic);
		}
		if(timestamp - other.timestamp != 0){
			return (int)(timestamp - other.timestamp);
		}
		return 0;
	}
	public int compareTo(AccessLogSortKey other) {
		if(upTraffic - other.upTraffic != 0){
			return (int)(upTraffic - other.upTraffic);
		}
		if(downTraffic - other.downTraffic != 0){
			return (int)(downTraffic - other.downTraffic);
		}
		if(timestamp - other.timestamp != 0){
			return (int)(timestamp - other.timestamp);
		}
		return 0;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (downTraffic ^ (downTraffic >>> 32));
		result = prime * result + (int) (timestamp ^ (timestamp >>> 32));
		result = prime * result + (int) (upTraffic ^ (upTraffic >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AccessLogSortKey other = (AccessLogSortKey) obj;
		if (downTraffic != other.downTraffic)
			return false;
		if (timestamp != other.timestamp)
			return false;
		if (upTraffic != other.upTraffic)
			return false;
		return true;
	}

	
	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	public long getUpTraffic() {
		return upTraffic;
	}

	public void setUpTraffic(long upTraffic) {
		this.upTraffic = upTraffic;
	}

	public long getDownTraffic() {
		return downTraffic;
	}

	public void setDownTraffic(long downTraffic) {
		this.downTraffic = downTraffic;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	
	

}

  好了,可以使用spark了

AppLogSpark.java

package com.fei;

import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

/**
 * 读取app-log.txt中的内容,然后按设备号统计出每个设备号总的上行流量/总的下行流量,
 * 然后挑出前10个上行流量最大的设备号,打印出来
 * @author Jfei
 *
 */
public class AppLogSpark {

	public static void main(String[] args) {
		//1.创建spark配置文件及上下文对象
		SparkConf conf = new SparkConf().setAppName("appLogSpark").setMaster("local");
		JavaSparkContext sc = new JavaSparkContext(conf);
		
		//2.读取日志文件,并创建一个RDD,使用sparkContext方法textFile()可以读取本地文件或
		//HDFS文件,创建的RDD会包含文件中的所有内容数据
		JavaRDD<String> appLogRDD = sc.textFile("e:\\app-log.txt");
		
		//3.将appLogRDD映射成k-v形式<设备号,AccessLogInfo>的RDD
		//可以这样理解为List<deviceId,AccessLogInfo>,deviceId是可以对应多个AcessLogInfo的 
		JavaPairRDD<String, AccessLogInfo> appLogPairRDD = mapAppLogRDD2Pair(appLogRDD);
		
		//4.将appLogPairRDD根据key进行聚合,并统计
		//可以这样理解List<deviceId,AccessLogInfo>聚合后,deviceId只有对应一个AccessLogInfo了,
		//AccessLogInfo里面的数据就是某个deviceId的总上行流量/总下行流量了
		JavaPairRDD<String, AccessLogInfo> aggregateLogPairRDD =  aggregateByDevice(appLogPairRDD);
		
		//5.排序,按上行流量、上行流量、时间戳排序
		//因为JavaPairRDD中排序只有sortByKey(XX),而我们这是根据value排序的,所以需要
		//将JavaPairRDD<String, AccessLogInfo>转为JavaPairRDD<AccessLogInfo, String>的RDD,
		//而AccessLogInfo只是个普通的POJO,为了便于比较排序,定义个AccessLogSortKey对象
		JavaPairRDD<AccessLogSortKey, String > logSortRDD =  mapRDDKey2SortKey(aggregateLogPairRDD);
		
		//6.实现排序
		JavaPairRDD<AccessLogSortKey, String >  sortRDD = logSortRDD.sortByKey(false);//降序
		//7.取前10个
		List<Tuple2<AccessLogSortKey, String>>  list = sortRDD.take(10);
		
		//打印
		for(Tuple2<AccessLogSortKey, String> t : list){
			System.out.println(t._2 + "\t" + t._1.getTimestamp() + "\t" + t._1.getUpTraffic()+ "\t" + t._1.getDownTraffic());
		}
		
		//关闭
		sc.close();
	}
	/**
	 * 将appLogRDD映射成key-value形式的JavaPairRDD<String, AccessLogInfo>的RDD
	 * @param appLogRDD
	 * @return
	 */
	private static JavaPairRDD<String, AccessLogInfo> mapAppLogRDD2Pair(JavaRDD<String> appLogRDD){
		return appLogRDD.mapToPair(new PairFunction<String, String, AccessLogInfo>() {

			private static final long serialVersionUID = 1L;

			//accessLog是对应文件中的一行数据
			public Tuple2<String, AccessLogInfo> call(String accessLog) throws Exception {
				//根据\t对一行的数据进行分割
				String[] data = accessLog.split("\t");
				long timestamp = Long.parseLong(data[0]);
				String deviceId = data[1];
				long upTraffic = Long.parseLong(data[2]);
				long downTraffic = Long.parseLong(data[3]);
				
				AccessLogInfo info = new AccessLogInfo(timestamp,upTraffic,downTraffic);
				return new Tuple2<String, AccessLogInfo>(deviceId,info);
			}
		});
	}
	/**
	 * 将JavaPairRDD<String, AccessLogInfo>进行聚合
	 * @param appLogPairRDD
	 * @return
	 */
	private static JavaPairRDD<String, AccessLogInfo> aggregateByDevice(JavaPairRDD<String, AccessLogInfo> appLogPairRDD){
		return appLogPairRDD.reduceByKey(new Function2<AccessLogInfo, AccessLogInfo, AccessLogInfo>() {
			
			private static final long serialVersionUID = 1L;

			public AccessLogInfo call(AccessLogInfo v1, AccessLogInfo v2) throws Exception {
				//最早的访问时间
				long timestamp = v1.getTimestamp() < v2.getTimestamp() ? v1.getTimestamp() : v2.getTimestamp();
				long upTraffic = v1.getUpTraffic() + v2.getUpTraffic();//总上行流量
				long downTraffic = v1.getDownTraffic() + v2.getDownTraffic();//总下行流量
				return new AccessLogInfo(timestamp,upTraffic,downTraffic);
			}
		});
	}
	
	/**
	 * 将JavaPairRDD<String, AccessLogInfo>转为JavaPairRDD<AccessLogSortKey, String >便于后面的排序
	 */
	private static JavaPairRDD<AccessLogSortKey, String > mapRDDKey2SortKey(JavaPairRDD<String, AccessLogInfo> aggregateRDD){
		return aggregateRDD.mapToPair(new PairFunction<Tuple2<String,AccessLogInfo>,AccessLogSortKey, String >() {
			private static final long serialVersionUID = 1L;
			public Tuple2<AccessLogSortKey, String> call(Tuple2<String, AccessLogInfo> t) throws Exception {
				String deviceId = t._1;
				AccessLogInfo info = t._2;
				AccessLogSortKey sortKey = new AccessLogSortKey(info.getTimestamp(),info.getUpTraffic(),info.getDownTraffic()	);
				return new Tuple2<AccessLogSortKey, String>(sortKey,deviceId);
			}
		});
	}
}

执行后,打印出的日志




 





Spark构建生产级用户流失预测Pipeline实战 用户流失预测是典型的业务驱动型机器学习任务,其核心不在算法本身,而在于特征工程的稳定性、标签定义的业务对齐性,以及端到端pipeline的可追溯与可重现能力。基于Spark DataFrame的全链路处理,能天然保障计算口径一致性、分区裁剪效率和Delta Lake版本管理能力;而pandas UDF结合LightGBM的推理架构,则在模型表达力与工程可控性之间取得关键平衡。该方案已广泛应用于电信、SaaS与金融行业,支撑千万级用户日更特征、百维以上业务可解释特征、Top-K Lift等可行动指标交付。本文 阅读详情

相关推荐

Spark Word Count深度解析:从单机HashMap到分布式DAG

Word Count是理解分布式计算范式的经典入口,其本质远超单词统计——它揭示了数据分片、惰性求值、Shuffle机制与容错血缘等核心原理。作为Apache Spark的‘Hello World’,它承载着RDD抽象、DAG执行图和Tungsten优化引擎的技术价值,广泛应用于日志分析、实时流处理与数仓ETL等生产场景。通过对比单机Java实现与Spark分布式实现,可清晰把握从本地内存计算到集群协同调度的关键跃迁。本文聚焦Spark Java API下的Word Count实践,深入解析reduceBy

weixin_34293141的博客 373

Java数据按照时间排序

一、 List<DataStatistic> statAllList = new ArrayList<DataStatistic>(); Collections.sort(statAllList, new Comparator<DataStatistic>() { @Override public int compare(DataStatistic o1, DataStatistic o2) { // 按照时间进行降序排列 DateFormat timform

Rux子兮的博客 8518

Spark大表Join性能优化实战:从原理到7步落地

Spark Join是大数据计算中最常见也最易引发性能瓶颈的操作,其本质是分布式数据关联,涉及Catalyst逻辑优化、Tungsten内存执行、Shuffle网络传输等多层机制。理解BroadcastHashJoin、SortMergeJoin与ShuffledHashJoin等策略的适用边界,关键在于识别数据规模、分布特征与物理存储有序性。技术价值体现在显著降低Shuffle数据量、规避OOM与GC风暴、提升端到端SLA稳定性。典型应用场景包括电商宽表构建、用户行为与画像关联、金融风控特征拼接等实时/离

anchang7456的博客 353

Spark案例之流量统计(三种方法)

数据集 1,2020-02-18 14:20:30,2020-02-18 14:46:30,20 1,2020-02-18 14:47:20,2020-02-18 15:20:30,30 1,2020-02-18 15:37:23,2020-02-18 16:05:26,40 1,2020-02-18 16:06:27,2020-02-18 17:20:49,50 1,2020-02-18 17:21:50,2020-02-18 18:03:27,60 2,2020-02-18 14:18:24,2020-

weixin_43648241的博客 1888

Synapse ML统一接口:构建可扩展的机器学习流水线

机器学习流水线(ML Pipeline)是实现模型工程化落地的核心范式,其本质是将数据预处理、特征工程、模型训练、评估与部署等环节封装为可复用、可版本化、可跨环境执行的声明式工作流。Synapse ML通过统一Python API抽象,屏蔽底层计算引擎(如Spark、LightGBM、ONNX Runtime)差异,实现单接口定义、多环境运行;其Massively Scalable特性依托Spark DataFrame惰性求值与分布式算法设计,支持从本地调试到EB级数据的平滑扩展。该方案显著降低ML工程师在

dengjuanshou7445的博客 384

微信小程序真机HTTPS证书链失效排查与修复指南

HTTPS证书信任链是保障Web通信安全的基础机制,其核心在于客户端能否通过服务器提供的证书及其上级签发者,逐级回溯至自身预置的可信根证书。在微信小程序场景中,由于客户端不复用系统根证书库,而是采用固化、精简且更新滞后的自研CA白名单,导致大量符合浏览器标准的证书(如Let’s Encrypt新版ISRG Root X1、TrustAsia等)在真机环境下触发net::ERR_CERT_AUTHORITY_INVALID错误。该问题本质是证书链断裂或签名算法/密钥长度不合规,而非域名配置或CORS策略异常。

weixin_33935636的博客 680

java sortby_使用sortBy对JavaRDD进行排序

我有JavaRDD>并希望根据其整数字段对其进行排序。如果RDD只有一个字段,它可以正常工作。JavaRDD sorted = wordSet.sortBy(x -> x, false, 10);但由于它的字段是Tuple2,它不起作用。我尝试了以下代码:JavaRDD> sorted1 = wordSet1.sortBy(new Function, Integer>() ...

weixin_34039159的博客 1876

西红柿成熟度检测数据集总结

成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。

crz1336768325的博客 2125

MapReduce——流量汇总程序案例(统计每一个手机号耗费的总上行流量、下行流量、总流量)

一、准备 (1)windows可以连接hadoop集群 (2)配置hadoop和jdk的环境变量 (3)一份要处理的数据xxx.txt 二、分析 基本思路: Map阶段: (1)读取一行数据,切分字段 (2)抽取手机号、上行流量、下行流量 (3)以手机号为key,bean对象为value输出,即context.write(手机号,bean); Reduce阶段: (1)累加上...

晓风岚月 3193

操作系统原理:【优麒麟】linux内核添加系统调用

在底端添加如下代码。

Joyce_zz的博客 2710

SpringBoot+VUE3实战:如何用WebSocket搞定网页端语音通话(避坑指南)

本文详细介绍了如何使用SpringBoot和VUE3结合WebSocket技术实现网页端语音通话功能。从环境配置、WebSocket服务端实现到前端音频处理,提供了完整的开发指南和避坑建议,帮助开发者快速构建稳定高效的实时语音通信系统。

weixin_29021195的博客 221

spark 车流量项目实战

spark 车流量项目实战 这里目录标题spark 车流量项目实战1、车流向项目介绍1.1. 数据采集1.2. 模块介绍1.2.1. 卡扣流量分析模块介绍1.3. 项目架构介绍1.4. 数据介绍1.4.1. 基本概念1.4.2. 表1.5. 需求分析2、数据流程3、spark任务如何将Spark任务提交到集群运行?4、模块功能4.1、卡口流量分析4.1.1. 卡口状态监控4.1.1.1. 统计卡口坏摄像头4.1.1.2. 统计每个区域车流量4.1.1.3. 统计每个区域的摄像头4.1.1.5 卡口流量分

忄凝^的博客 3626

相位编码脉冲压缩信号的理论研究与 Matlab 实现

通过实际的代码示例,我们展示了如何生成信号、进行相位编码、传输信号、相位解码和脉冲压缩的步骤。相位编码脉冲压缩信号是通过在发射端对信号进行相位编码,并在接收端对信号进行相位解码来实现的。其主要原理是在发射端将信号的频率进行调制,使得信号具有宽带特性,然后在接收端通过匹配滤波器对信号进行解调和压缩,从而提高信号的分辨率和抗干扰能力。相位编码脉冲压缩信号是一种在信号处理中常用的技术,用于提高信号的分辨率和抗干扰能力。可以使用 Matlab 中的信号生成函数生成一个宽带脉冲信号,例如矩形脉冲信号或高斯脉冲信号。

CyberWizarDD的博客 905

arrylist spark_基于spark的用户访问流量统计(java版)

关于数据的生成数据非实际数据,由java代码生成。分别为:用户设备号UUID,时间戳,上下流量和下行流量。关键代码如下。public static void main(String[] args) {StringBuffer sb = new StringBuffer();Random rand = new Random();List device = new ArrayList();for(in...

weixin_39714763的博客 205

华为od 面试手撕代码题【完成任务最少小时】

华为od 面试手撕代码题【完成任务最少小时】

MISAYAONE的博客 1582

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 315

基于Spark对某移动APP流量访问日志分析(Java版)

目录需求分析数据原型设计思路数据模型及演化过程实施过程 需求分析 我们来根据移动设备唯一标识deviceID来计算来自客户端用户访问日志请求和响应的上行流量、下行流量的记录。 上行流量:指的是手机app向服务器发送的请求数据的流量 下行流量:指的是服务器端给手机app返回的数据(比如说图片、文字、json)的流量 1.计算每个设备(deviceID)总上行流量之和与下行流量之和(取时间戳取最小的deviceID) eg: 时间戳 设备号 上行流量 下行流量 1 001 79976 114

蔡政洁的博客 891

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1403

spark实战-移动端app访问流量日志分析

综合案例-移动端app访问流量日志分析 移动端app访问流量日志分析 背景 如果你是在一个互联网公司,然后你的公司现在也在做移动互联网,做了一个手机app,那么你的手机app的用户,每次进行点击,或者是一些搜索操作的时候,都会跟你的远程的后端服务器做一次交互,也就是说,你的手机app,首先会往后端服务器发送一个请求,然后你的后端服务器会给你的手机app返回一个响应,响应的内容可能是图片、或者文字...

htfenght的博客 1771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

spark 实际项目分析-移动端app日志

本文章是企业的一个真实案例简化而来的,主要是统计那个用户的下载流量和上传流量,从而真实分析出每个用户的流量使用情况为完成此功能需要4个类1 AccessLogInfo.java: 用户流量实体信息public class AccessLogInfo implements Serializable { private static final long serialVersionUID = ...

贾红平 1155

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spark RDD案例(三)连续分布数据按照条件rollup

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

xiaohu21的博客 517

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

视频教程-8天大数据真实项目Spark电商离线和实时分析系统-Spark

8天大数据真实项目Spark电商离线和实时分析系统 张长志技术全才、擅长领域...

weixin_34263725的博客 731

基于Spark的电商用户行为分析实战:从数据清洗到可视化全流程

在大数据时代,分布式计算框架是处理海量用户行为数据的核心技术。Apache Spark凭借其内存计算和DAG执行引擎,能够高效完成数据清洗、转换与聚合等复杂任务,为业务决策提供实时洞察。其核心价值在于将批处理能力与易用API结合,广泛应用于用户画像构建、流量分析和商品推荐等场景。本项目聚焦电商领域,通过模拟用户行为数据,详细演示了如何利用Spark RDD和DataFrame进行多维度分析,包括PV/UV统计、用户路径挖掘和热门商品识别,最终通过Web界面实现分析结果的可视化展示,为构建数据分析项目原型提供

Eric.Net的专栏 469

一个Spark程序,处理网络日志

package com.shibazhang.sparkapplog; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import org.apache.spark.SparkConf; import org.apache.spark.api.java.Java

hualugu_6的博客 549

从Spark API使用者到性能调优专家:原理、实战与避坑指南

分布式计算框架是处理海量数据的核心技术,其通过将计算任务分解并分配到多台机器并行执行,以解决单机资源瓶颈。其核心原理在于任务调度、数据分区与跨节点通信(Shuffle)。理解这些原理对于实现高效数据处理至关重要,能直接提升作业执行速度并降低资源消耗。在实际工程中,性能调优与问题排查是衡量开发者水平的关键,涉及内存管理、数据倾斜处理等核心技能。本文以Apache Spark这一主流框架为例,深入剖析其Driver-Executor架构与Stage划分机制,并通过一个完整的电商日志分析案例,手把手演示如何从环境

weixin_33796205的博客 335

想转行人工智能?机会来了!

&#13; &#13; &#13; &#13; &#13; &#13; &#13; 对人工智能而言,2017是不平凡的一年:AlphaGo再胜人类腾讯宣布进军AI百度无人驾驶汽车上五环...

Java团长 1147
上一篇: 机器学习02之BP神经网络图解及JAVA实现
下一篇: spark学习03之wordCount统计并排序(java)
夢_殤
博客等级 码龄15年 348粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值