掌握RDD算子

news/2024/5/20 4:51:40 标签: 大数据, hadoop, hdfs

文章目录

      • 一、准备本地系统文件
      • 二、把文件上传到HDFS
      • 三、启动HDFS服务
      • 四、启动Spark服务
      • 五、启动Spark Shell
      • 六、映射算子案例
        • 任务1、将rdd1每个元素翻倍得到rdd2
        • 任务2、将rdd1每个元素平方得到rdd2
        • 任务3、利用映射算子打印菱形
        • IDEA里创建项目实现
      • 七、过滤算子案例
        • 任务1、过滤出列表中的偶数
        • 任务2、过滤出文件中包含spark的行

一、准备本地系统文件

  • /home目录里创建words.txt
  • 在这里插入图片描述在这里插入图片描述

二、把文件上传到HDFS

  • words.txt上传到HDFS系统的/park目录里
    在这里插入图片描述
  • 说明:/park是在上一讲我们创建的目录

三、启动HDFS服务

  • 执行命令:start-dfs.sh在这里插入图片描述

四、启动Spark服务

  • 执行命令:start-all.sh在这里插入图片描述

五、启动Spark Shell

-执行命令:spark-shell --master spark://master:7077
在这里插入图片描述

六、映射算子案例

  • 预备工作:创建一个RDD - rdd1
  • 执行命令:val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5, 6))

在这里插入图片描述

任务1、将rdd1每个元素翻倍得到rdd2

  • 对rdd1应用map()算子,将rdd1中的每个元素平方并返回一个名为rdd2的新RDD
    在这里插入图片描述
  • 其实,利用神奇占位符_可以写得更简洁
    在这里插入图片描述
  • rdd1和rdd2中实际上没有任何数据,因为parallelize()和map()都为转化算子,调用转化算子不会立即计算结果。
    在这里插入图片描述
  • 若需要查看计算结果,则可使用行动算子collect()。(collect是采集或收集之意)
    在这里插入图片描述

任务2、将rdd1每个元素平方得到rdd2

  • 方法一、采用普通函数作为参数传给map()算子
    在这里插入图片描述
  • 方法二、采用下划线表达式作为参数传给map()算子
    在这里插入图片描述
  • rdd2的元素变成了双精度实数,得转化成整数
    在这里插入图片描述

任务3、利用映射算子打印菱形

  • 右半菱形

val rdd = sc.makeRDD(List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1))
val rdd1 = rdd.map(“*” * _)
rdd1.collect.foreach(println)

在这里插入图片描述

IDEA里创建项目实现

  • 创建Maven项目 - SparkRDDDemo
    在这里插入图片描述
  • 将java目录改成scala目录
    在这里插入图片描述
  • 在pom.xml文件里添加相关依赖和设置源程序目录
<?xml version="1.0" encoding="UTF-8"?>
<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>net.hw.rdd</groupId>
    <artifactId>SparkRDDDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.12.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>2.4.4</version>
        </dependency>
    </dependencies>
    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.3.2</version>
                <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>
        </plugins>
    </build>
</project>

  • 添加日志属性文件
    在这里插入图片描述
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spark.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

  • 创建hdfs-site.xml文件,允许客户端访问集群数据节点
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property>
        <description>only config in clients</description>
        <name>dfs.client.use.datanode.hostname</name>
        <value>true</value>
    </property>
</configuration>

  • 创建net.xxr.rdd.day01包
    在这里插入图片描述
  • 在net.xxr.rdd.day01包里创建Example01单例对象
    在这里插入图片描述
package net.xxr.rdd.day01

import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ListBuffer
import scala.io.StdIn

object Example01 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName("PrintDiamond")
      .setMaster("local[*]")

    val sc = new SparkContext(conf)
    print("输入一个奇数:")
    val n = StdIn.readInt()
    if (n % 2 == 0) {
      println("你输入的不是奇数哦~")
      return
    }
    val list = new ListBuffer[Int]()
    (1 to n by 2).foreach(list += _)
    (n - 2 to 1 by -2).foreach(list += _)
    val rdd = sc.makeRDD(list)
    val rdd1 = rdd.map(i => " " * ((n - i) / 2) + "*" * i)
    rdd1.collect.foreach(println)
  }

}

  • 查看结果
    在这里插入图片描述

七、过滤算子案例

任务1、过滤出列表中的偶数

  • 方法一、将匿名函数传给过滤算子

val rdd1 = sc.makeRDD(List(4, 7, 9, 2, 45, 89, 120, 666, 25, 129))
val rdd2 = rdd1.filter(x => x % 2 == 0)
rdd2.collect

在这里插入图片描述

  • 方法二、用神奇占位符改写传入过滤算子的匿名函数
    在这里插入图片描述

任务2、过滤出文件中包含spark的行

  • 执行命令: val lines= sc.textFile(“/park/words.txt”),读取文件 /park/words.txt生成RDD - lines
    在这里插入图片描述
  • 执行命令:val sparkLines = lines.filter(_.contains(“spark”)),过滤包含spark的行生成RDD - sparkLines
    在这里插入图片描述
  • 执行命令:sparkLines.collect,查看sparkLines内容,可以采用遍历算子,分行输出内容

http://www.niftyadmin.cn/n/347001.html

相关文章

如何减少DevOps工具的泛滥

在过去十年投资于devops之后&#xff0c;许多公司正在经历某种后遗症&#xff1a;工具蔓延。虽然他们的软件交付流程变得更加精简、高效和可靠&#xff0c;但他们也拥有更多的工具来许可、维护和管理。 工具蔓延通常被视为开发团队的灵活性和授权选择他们自己的工具的自然结果…

【SCI征稿】CCF推荐|Springer旗下2区无线网络类SCI, 2个月左右录用~

一、【期刊简介】 JCR2区无线网络类SCI 【期刊概况】IF: 2.0-3.0&#xff0c;JCR2/3区&#xff0c;中科院4区&#xff1b; 【终审周期】走期刊系统&#xff0c;3个月左右录用; 【检索情况】SCI&EI双检&#xff1b; 【数据库收录年份】1967年&#xff1b; 【自引率】11…

ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符...&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, …

类和结构体的区别

概述 类和结构体的区别 差异和举例 首先我们来理解一个概念&#xff0c;类和结构体是怎么发展起来的呢&#xff1f; 其实早在C的时代&#xff0c;就有了结构体的概念&#xff0c;但是在在C语言中struct是只能定义数据成员&#xff0c;而不能定义成员函数的。这其实就对于结构体…

Mybatis连接MySQL数据库通过逆向工程简化开发流程

文章目录 一、使用步骤1、建立新项目2、引入pom依赖3、创建逆向工程的配置文件 generatorConfig.xml4、运行逆行工程&#xff0c;生成代码文件 二、案例展示1、建立数据表2、改写对应的配置文件内容1、数据库连接配置,指定自己的数据库2、配置pojo生成的位置3、配置sql映射文件…

网络编程--纯重叠IO方式实现回声服务器

写在前面 重叠IO模型一文中只介绍了执行重叠IO的Sender和receiver&#xff0c;但还未利用该模型实现过回声服务器&#xff0c;因此&#xff0c;本文将在此基础上实现基于重叠IO模型的回声服务器。 ioctlsocket ioctlsocket函数用于创建非阻塞模式的套接字。ioctlsocket用于控…

统计一个数的二进制中1的个数(三种方法)

那么好了好了&#xff0c;宝子们&#xff0c;今天给大家分享一篇经典例题的三种实现方法&#xff0c;来吧&#xff0c;开始整活&#xff01;⛳️ 一、基础法 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int number_of_one(int n) {int count 0;while(n){if…

关于K8S库中高可用的锁机制详解

简介 对于无状态的组件来说&#xff0c;天然具备高可用特性&#xff0c;无非就是多开几个副本而已&#xff1b;而对于有状态组件来说&#xff0c;实现高可用则要麻烦很多&#xff0c;一般来说通过选主来达到同一时刻只能有一个组件在处理业务逻辑。 在Kubernetes中&#xff0c;…