【十】Spark Streaming中transform、leftjoin的使用Local模式(使用Scala语言)

transform方法把DStream转换成新的RDD

需求:黑名单过滤。

访问日志 ==>DStream

20180718,sid

20180718,lee

20180718,leo

      ==>(sid:20180718,sid)(lee:20180718,lee)(leo:20180718,leo)

 

leftjoin

黑名单表 ==>RDD

lee

leo

    ==>  (lee:true)(leo:true)

 

结果

sid:[<20180718,sid>,<false>])  X

lee:[<20180718,lee>,<true>])   X

leo:[<20180718,leo>,<true>])  ==> tuple 1

项目目录

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sid.spark</groupId>
  <artifactId>spark-train</artifactId>
  <version>1.0</version>
  <inceptionYear>2008</inceptionYear>
  <properties>
    <scala.version>2.11.8</scala.version>
    <kafka.version>0.9.0.0</kafka.version>
    <spark.version>2.2.0</spark.version>
    <hadoop.version>2.9.0</hadoop.version>
    <hbase.version>1.4.4</hbase.version>
  </properties>

  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.11</artifactId>
      <version>${kafka.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>servlet-api</artifactId>
          <groupId>javax.servlet</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <!--<dependency>-->
      <!--<groupId>org.apache.hbase</groupId>-->
      <!--<artifactId>hbase-clinet</artifactId>-->
      <!--<version>${hbase.version}</version>-->
    <!--</dependency>-->

    <!--<dependency>-->
      <!--<groupId>org.apache.hbase</groupId>-->
      <!--<artifactId>hbase-server</artifactId>-->
      <!--<version>${hbase.version}</version>-->
    <!--</dependency>-->

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>net.jpountz.lz4</groupId>
      <artifactId>lz4</artifactId>
      <version>1.3.0</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.31</version>
    </dependency>

  </dependencies>

  <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
          <args>
            <arg>-target:jvm-1.5</arg>
          </args>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <downloadSources>true</downloadSources>
          <buildcommands>
            <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
          </buildcommands>
          <additionalProjectnatures>
            <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
          </additionalProjectnatures>
          <classpathContainers>
            <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
            <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
          </classpathContainers>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>

代码

package com.sid.spark

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * Created by jy02268879 on 2018/7/18.
  *
  * 黑名单过滤
  */
object TransformApp {
  def main(args: Array[String]): Unit = {

    /**
      * 当运行Spark Streaming应用程序的时候如果使用的Local模式,
      * 不要使用local或者local[1]作为master的URL。
      * 因为这种写法意味着仅仅只有一个线程能被使用,
      * 如果使用基于Receiver的input DStream(如果用的HDFS上面的文件就可以用local[1]或local),
      * Receiver就已经占用了线程了,
      * 主流程就处理不了数据了。
      * 所以要用local[n],n>Receiver的数量。
      * */
    val sparkConf = new SparkConf().setMaster("local[2]").setAppName("SocketWordCount")

    //构建StreamingContext
    /**
      * 创建StreamingContext需要两个参数:sparkConf和batch interval
      * */
    val ssc = new StreamingContext(sparkConf,Seconds(5))

    /**
      * 构建黑名单
      * */
    val blacks = List("lee","leo")
    //把一个集合转换成RDD
    val blacksRDD = ssc.sparkContext.parallelize(blacks).map(x=>(x,true))


    val lines = ssc.socketTextStream("node1",6789)

    /**
      *
    访问日志 ==>DStream

    20180718,sid
    20180718,lee
    20180718,leo
      ==>(sid:20180718,sid)(lee:20180718,lee)(leo:20180718,leo)

    leftjoin

    黑名单表 ==>RDD

    lew
    leo
       ==>(lee:true)(leo:true)

    结果

    sid:[<20180718,sid>,<false>])  ==> tuple 1
    lee:[<20180718,lee>,<true>])   X
    leo:[<20180718,leo>,<true>])   X
      *
      * */
    val clicklog = lines.map(x => (x.split(",")(1),x)).transform(rdd => {
        rdd.leftOuterJoin(blacksRDD)
          .filter(x => x._2._2.getOrElse(false) != true)
          .map(x => x._2._1)
    })
    clicklog.print()

    ssc.start()

    ssc.awaitTermination()
  }

}

启动nc -lk 6789

IDEA启动项目

在nc输入

20180718,sid

20180718,lee

20180718,leo

非常感谢您的问题,我将为您提供一个简单的Hadoop+Spark实验代码实现供参考。 本实验将使用Python编程语言和Hadoop+Spark集群,对一个大型的电影数据集进行综合分析,包括数据预处理、数据分析和数据可视化呈现。实验代码如下: 1. 数据预处理 首先需要对电影数据集进行预处理,选择需要的字段、进行格式转换等操作,然后将预处理后的数据保存到HDFS中。本实验中我们使用Python编写脚本进行数据预处理,示例代码如下: ```python import os import sys # 加载Hadoop环境变量 os.environ['HADOOP_HOME'] = "/usr/local/hadoop" # 预处理函数,将原始数据集中的每一行按照','进行分割,只保留需要的字段 def preprocess(line): fields = line.split(',') return (fields[0], fields[1], fields[2], fields[3]) # 读取原始数据集 input_file = "/data/movies.csv" output_file = "/data/movies_processed.csv" input_rdd = sc.textFile(input_file) # 对每一行进行预处理 output_rdd = input_rdd.map(preprocess) # 将预处理后的数据保存到HDFS中 output_rdd.saveAsTextFile(output_file) ``` 2. 数据分析 接下来使用Spark对数据进行分析,利用Spark的分布式计算能力,充分发挥集群的性能优势。本实验使用SparkSQL和SparkMLlib组件进行分析,分析结果保存到MySQL数据库中。示例代码如下: ```python from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType from pyspark.ml.feature import VectorAssembler from pyspark.ml.regression import LinearRegression from pyspark.ml.evaluation import RegressionEvaluator import mysql.connector # 创建SparkSession spark = SparkSession.builder.appName("MovieAnalysis").getOrCreate() # 定义数据结构 schema = StructType([ StructField("movie_id", StringType(), True), StructField("title", StringType(), True), StructField("genres", StringType(), True), StructField("rating", DoubleType(), True) ]) # 从HDFS中读取数据 input_file = "/data/movies_processed.csv" input_df = spark.read.csv(input_file, header=False, schema=schema) # 使用SparkSQL进行数据分析 input_df.createOrReplaceTempView("movies") result_df = spark.sql("SELECT title, AVG(rating) AS avg_rating FROM movies GROUP BY title ORDER BY avg_rating DESC") # 使用SparkMLlib进行数据分析 assembler = VectorAssembler(inputCols=["rating"], outputCol="features") output_df = assembler.transform(input_df) (training_df, test_df) = output_df.randomSplit([0.7, 0.3]) lr = LinearRegression(featuresCol="features", labelCol="movie_id", maxIter=10, regParam=0.3, elasticNetParam=0.8) model = lr.fit(training_df) predictions = model.transform(test_df) evaluator = RegressionEvaluator(labelCol="movie_id", predictionCol="prediction", metricName="rmse") rmse = evaluator.evaluate(predictions) # 将分析结果保存到MySQL数据库中 cnx = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='movie_db') cursor = cnx.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS movie_ratings (title VARCHAR(255) NOT NULL, avg_rating FLOAT NOT NULL)") cursor.execute("TRUNCATE TABLE movie_ratings") for row in result_df.collect(): cursor.execute("INSERT INTO movie_ratings (title, avg_rating) VALUES (%s, %s)", (row.title, row.avg_rating)) cnx.commit() cursor.close() cnx.close() ``` 3. 数据可视化呈现 最后对分析结果进行可视化呈现,可以采用Python可视化或网页可视化等方法。本实验使用Python的Matplotlib库进行可视化呈现,将分析结果可视化为柱状图。示例代码如下: ```python import matplotlib.pyplot as plt import mysql.connector # 从MySQL数据库中读取分析结果 cnx = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='movie_db') cursor = cnx.cursor() cursor.execute("SELECT title, avg_rating FROM movie_ratings ORDER BY avg_rating DESC") results = cursor.fetchall() cursor.close() cnx.close() # 绘制柱状图 title_list = [row[0] for row in results] rating_list = [row[1] for row in results] plt.figure(figsize=(10, 6)) plt.bar(range(len(title_list)), rating_list) plt.xticks(range(len(title_list)), title_list, rotation=90) plt.xlabel("Movie Title") plt.ylabel("Average Rating") plt.title("Movie Ratings Analysis") plt.tight_layout() plt.show() ``` 以上是一个简单的Hadoop+Spark实验代码实现,仅供参考。在实际应用中,还需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值