Spark SQL基于网站Log的综合案例实战

本文介绍了一种使用 Java 在 SparkSQL 中手动创建自定义数据的方法,此方法可以生成包含日期、时间戳、用户ID等字段的论坛数据,便于进行后续的数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博文我们将手动添加数据,这个功能非常有用,我们可以根据自己的需要创造出满足自己需要的数据格式及内容,而且数据不需要清洗,话不多说,代码实战。

package com.dt.spark.SparkApps.sql.project;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 * 论坛数据自动生成代码,数据格式如下:
 * date: 日期 格式为:yy-MM-dd
 * timestamp: 时间戳
 * userID: 用户ID
 * pageID: 页面ID
 * chanelID: 板块的ID
 * action: 点击和注册
 *
 */
public class SparkSQLDataManually {

    /**
     * 具体的论坛频道,在实际开发的时候可以从文件读取生成列
     */
    static String[] channelNames = new String[]{
        "Spark","Scala","Kafka","Flink","Hadoop","Storm",
        "HBase","Impala","Java","Kudu","ML","DL"
    };

    static String[] actionNames = new String[]{"View","Register"}; 
    static String yesterdayFormated;

    public static void main(String[] args) throws IOException {
        /**
         * 通过传进来的参数生成指定大小规模的数据。
         */
        long numberItems = 5000;
        String path = ".";
        if(args.length > 0){
            numberItems = Integer.valueOf(args[0]);
            path = args[1];
        }
        System.out.println("User log number is :" + numberItems);

        /**
         * 昨天的时间的生成
         */
        yesterdayFormated = yesterday();

        userlogs(numberItems,path);
    }

    @SuppressWarnings("resource")
    private static void userlogs(long numberItems, String path) throws IOException {
        StringBuffer userLogBuffer = new StringBuffer("");
        Random random = new Random();
        for(int i = 0;i < numberItems;i++){
            long timestamp = new Date().getTime();

            //用户ID,随机生成器实现
            long userID = 0L;
            long pageID = 0L;

            //随机生成用户ID
            userID = random.nextInt((int)numberItems);

            //Page ID
            //随机生成的页面ID
            pageID = random.nextInt((int)numberItems);

            //随机生成channel
            String channel = channelNames[random.nextInt(12)];

            //随机生成action行为
            String action= actionNames[random.nextInt(2)];

            userLogBuffer.append(yesterdayFormated)
                         .append("\t")
                         .append(timestamp)
                         .append("\t")
                         .append(userID)
                         .append("\t")
                         .append(pageID)
                         .append("\t")
                         .append(channel)
                         .append("\t")
                         .append(action)
                         .append("\n");
        }
        System.out.println(userLogBuffer.toString());

        PrintWriter printWriter = null;
        printWriter = new PrintWriter(new OutputStreamWriter(
                new FileOutputStream(path + "userLog.log")));
        printWriter.write(userLogBuffer.toString());
        printWriter.close();
    }

    private static String yesterday() {
        SimpleDateFormat date = new SimpleDateFormat("yy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.DATE, -1);

        Date yesterday = cal.getTime();
        return date.format(yesterday);
    }

}

实验结果如下:

16-05-02    1462244815099   3978    1325    Scala   View
16-05-02    1462244815099   7833    4357    Hadoop  View
16-05-02    1462244815099   3148    44  HBase   Register
16-05-02    1462244815099   1012    4215    HBase   Register
16-05-02    1462244815099   9679    5166    HBase   View
16-05-02    1462244815099   7755    7357    DL  Register
16-05-02    1462244815099   8790    7303    Kudu    View
16-05-02    1462244815099   8354    456 Java    Register
16-05-02    1462244815100   1412    6501    Storm   View
16-05-02    1462244815100   6523    7202    Flink   View
16-05-02    1462244815100   4701    3808    Storm   Register
.......................
Apache Spark 是一个强大的分布式计算框架,尤其适合处理大规模数据集。在实际应用中,Spark 被广泛用于构建机器学习模型、实时数据处理、推荐系统等场景。以下是几个基于 Spark案例教程和实战指南,涵盖数据处理、模型训练及实时分析等内容。 ### 实战案例:机器学习模型部署 在机器学习项目中,Apache Spark 提供了 MLlib 库,支持多种机器学习算法的实现。以下是一个简单的线性回归模型训练与预测的流程: 1. **数据预处理**:使用 Spark 的 `DataFrame` API 加载并清洗数据,例如处理缺失值、标准化特征等。 2. **模型训练**:使用 `LinearRegression` 类进行模型训练。 3. **预测与评估**:使用训练好的模型对测试集进行预测,并计算误差指标。 ```python from pyspark.sql import SparkSession from pyspark.ml.regression import LinearRegression from pyspark.ml.feature import VectorAssembler from pyspark.ml.evaluation import RegressionEvaluator # 初始化 Spark 会话 spark = SparkSession.builder.appName("LinearRegressionExample").getOrCreate() # 加载数据 data = spark.read.csv("data.csv", header=True, inferSchema=True) # 特征向量化 assembler = VectorAssembler(inputCols=["feature1", "feature2"], outputCol="features") data = assembler.transform(data) # 划分训练集与测试集 train_data, test_data = data.randomSplit([0.8, 0.2]) # 初始化线性回归模型 lr = LinearRegression(featuresCol="features", labelCol="label") # 训练模型 lr_model = lr.fit(train_data) # 预测 predictions = lr_model.transform(test_data) # 评估 evaluator = RegressionEvaluator(labelCol="label", predictionCol="prediction", metricName="rmse") rmse = evaluator.evaluate(predictions) print(f"Root Mean Squared Error (RMSE): {rmse}") ``` 该案例展示了 Spark 在机器学习模型部署中的典型流程,包括数据预处理、模型训练和评估[^1]。 --- ### 实战案例:实时推荐系统 Apache Spark 的流处理能力(Spark Streaming)可以用于构建实时推荐系统。以下是一个基于协同过滤的推荐系统流程: 1. **数据采集**:从 Kafka 或其他消息队列中实时获取用户行为数据。 2. **模型更新**:使用 `ALS`(交替最小二乘法)算法动态更新推荐模型。 3. **实时推荐**:根据用户的最新行为生成推荐结果。 ```python from pyspark.sql import SparkSession from pyspark.streaming import StreamingContext from pyspark.ml.recommendation import ALS # 初始化 Spark 会话 spark = SparkSession.builder.appName("RealTimeRecommendation").getOrCreate() # 模拟实时数据流 def process_stream(rdd): if not rdd.isEmpty(): df = spark.createDataFrame(rdd, ["userId", "movieId", "rating"]) als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating") model = als.fit(df) userRecs = model.recommendForAllUsers(10) userRecs.show() # 设置 StreamingContext ssc = StreamingContext(spark.sparkContext, batchDuration=1) lines = ssc.socketTextStream("localhost", 9999) # 解析数据并处理 lines.map(lambda line: line.split(",")).foreachRDD(process_stream) # 启动流处理 ssc.start() ssc.awaitTermination() ``` 该案例展示了如何使用 Spark Streaming 和 MLlib 构建一个实时推荐系统,适用于电商平台、视频网站等需要个性化推荐的场景[^2]。 --- ### 实战案例:大规模数据处理 Spark 的分布式计算能力使其在处理大规模数据集时表现出色。以下是一个使用 Spark 进行日志分析的示例: ```python from pyspark.sql import SparkSession # 初始化 Spark 会话 spark = SparkSession.builder.appName("LogAnalysis").getOrCreate() # 读取日志文件 logs = spark.read.text("server_logs.txt") # 提取关键信息(如 IP、时间戳、请求方法等) import re from pyspark.sql.functions import udf from pyspark.sql.types import StringType def extract_ip(log_line): match = re.match(r'(\d+\.\d+\.\d+\.\d+)', log_line) return match.group(1) if match else None extract_ip_udf = udf(extract_ip, StringType()) logs = logs.withColumn("ip", extract_ip_udf("value")) # 统计访问次数最多的 IP top_ips = logs.groupBy("ip").count().orderBy("count", ascending=False).limit(10) top_ips.show() ``` 该案例展示了 Spark 在大规模日志分析中的应用,适用于服务器监控、网络安全等领域[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值