目录


一、了解Scala

1.1 了解Scala语言

1.2了解Scala特性

1.3 函数组合器

1.3.1 map()方法

1.3.2foreach()方法

1.3.3flter()方法

1.3.4flatten()方法

1.3.5flatMap()方法

1.3.6.groupBy()方法

二、Scala编程基础

2.1创建RDD

2.1.1从内存中读取数据创建RDD

2.1.2从外部存储系统中读取数据创建RDD

2.2RDD的两种类型操作

2.2.1转换操作

2.2.2行动操作

 2.2.3使用map()方法转换数据

2.2.4使用sortBy()方法进行排序

2.2.5 使用collect()方法查询数据

2.2.6 使用flatMap()转换数据

编辑

2.2.7 使用take()方法查询某几个值

2.2.8使用union()方法合并多个RDD

2.2.9 使用filter()方法进行过滤

2.2.10使用distinct()进行去重

2.3 集合操作 

2.3.1intersection()方法

2.3.2cartesian()方法

2.3.3subtract()方法

1.3任务实现

三、spark SQL--结构化数据文件处理

3.1 了解spark SQL概念

3.2 Spark SQL的运行过程 

3.3 掌握DateFrame基础

3.3.1 创建DateFtame对象

3.4查看DateFrame数据

3.4.1printSchema:输出数据模式

3.4.2show()查看数据

3.4.3 first()/head()/take()/takeAsList():获取若干条记录

3.4.4collect()/collectAsList(): 获取所有数据

3.5 DateFrame查询

3.5.1 where()/filter()方法

3.5.2 select()/selectExpr()/col()/apply()方法

3.5.3limit()方法

3.5.4.orderBy()/sort()方法


一、了解Scala

1.1 了解Scala语言

        Scala 是 Scalable Language 的缩写,是一种多范式的编程语言,由洛桑联邦理工学院的马丁·奥德斯在 2001 年基于 Funnel 的工作开始设计,设计初衷是想集成面向对象编程和函数式编程的各种特性。Scala 是一种纯粹的面向对象的语言,每个值都是对象。Scala也是一种西数式语言,因此函数可以当成值使用。由于 Scala 整合了面向对象编程和函数式编程的特性,因此 Scala 相对于 Java、C#、C++等其他语言更加简洁。Scala 源代码会被编译成 Java 字节码,因此 Scala 可以运行于 Java 虚拟机(Java VirtualMachine,JVM)之上,并可以调用现有的Java 类库。

1.2了解Scala特性

(1)面向对象tai
Scala 是一种纯粹的面向对象语言。一个对象的类型和行为是由类和特征描述的。类通过子类化和灵活的混合类进行扩展,成为多重继承的可靠解决方案。
(2)函数式编程
Scala 提供了轻量级语法来定义匿名函数,支持高阶函数,允许函数嵌套,并支持函数柯里化。Scala 的样例类与模式匹配支持函数式编程语言中的代数类型。Scala 的单例对象提供了方便的方法来组合不属于类的函数。用户还可以使用 Scala 的模式匹配,编写类似正则表达式的代码处理可扩展标记语言(Extensible Markup Language,XML)格式的数据。
(3)静态类型
Scala 配备了表现型的系统,以静态的方式进行抽象,以安全和连贯的方式进行使用。系统支持将通用类、内部类、抽象类和复合类作为对象成员,也支持隐式参数、转换和多态方法等,为抽象编程的安全重用和软件类型的安全拓展提供了强大的支持。

1.3 函数组合器

1.3.1 map()方法

        map()方法可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元
素的新列表。例如,定义一个 Int 类型列表,列表中的元素为 1~5,使用 map0方法对列表中
的元素进行平方计算。
 

scala> val num;List[Int]=List(1,2,3.4.
         num: Ligt[Int] = List(1, 2,3,4,5)
         scala> num.map(x=>x*x)
         res52; List[Int] = List(1, 4, 9, 16, 25)

1.3.2foreach()方法

        foreach()方法和 map()方法类似,但是 foreach()方法没有返回值,只用于对参数的结
进行输出。例如,使用 foreach()方法对 num 中的元素进行平方计算并输出。

Spark 基础实验 spark编程基础实验4答案_spark

1.3.3flter()方法

        使用flter()方法可以移除传人函数的返回值为 false 的元素。例如,过列表 num中
奇数,得到只包含偶数的列表。

Spark 基础实验 spark编程基础实验4答案_分布式_02

1.3.4flatten()方法

        fatten()方法可以将嵌套的结构展开,即 flaten()方法可以将一个二维的列表展开成一
个一维的列表。定义一个二维列表 list,通过 fatten()方法可以将 ist 展开为一维列表。
     

scala> val list=List(L1st(1,2,3),List(4,5,6))
         list: List[List[Int]] m LigtList(1,2,3), L1st(4,5,6))
         scala> list.flotta
         res63: List[Int] = List(1, 2, 3,4,5, 6)

1.3.5flatMap()方法

        flatMap()方法结合了 map()方法和 flatten()方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接.
    

scala> val str = list("a:b:c”, "d:e:f
         str: List[String] = List(a:b:c, d:e:f)
         scala> str.flatMap(x = x.split(":"))
         res2: List[Stringi = List(a, b, c, d, e, f)

1.3.6.groupBy()方法

        groupBy()方法可对集合中的素进行分组操作,返回的结果是一个映射。对1~10根据奇偶性进行分组,因此 groupBy0方法传人的参数是一个计算偶数的函数,得到的结果是一个映射,包含两个键值对,键为 false 对应的值为奇数列表,键为 rue 对应的值为偶数列表。

二、Scala编程基础

2.1创建RDD

2.1.1从内存中读取数据创建RDD

        从内存中读取数据创建RDD有两种常用的方法,第一种是将内存中已有的Seq集合转换为RDD,第二种是把已有RDD转换成新的RDD。
        SparkContext类中有两个方法,即parallelize()方法和makeRDD()方法。parallelize()方法和makeRDD()方法均利用内存中已存在的集合,复制集合数据创建RDD的元素去创建一个可用于并行计算的RDD。

1. parallelize()
parallelize()方法有两个输入参数,说明如下。
(1)要转化的集合:必须是Seq集合。Seq表示序列,指的是一类具有一定长度的、迭代访问的对象,其中每个数据元素均带有一个从0开始的、固定的索引。
(2)分区数。若不设分区数,则RDD的分区数默认为该程序分配到的资源的CPU核心数。通过parallelize()方法用一个数组的数据创建RDD,并设置分区数为4。

Spark 基础实验 spark编程基础实验4答案_数据_03

Spark 基础实验 spark编程基础实验4答案_数据_04

2. makeRDD()
        makeRDD()方法有两种使用方式,第一种使用方式与parallelize()方法一致;第二种方式是通过接收一个Seq[(T,Seq[String])]参数类型创建RDD。第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照Seq[(T,Seq[String])]的顺序存放到各个分区中,一个Seq[String]对应存放至一个分区,并为数据提供位置信息,通过preferredLocations()方法可以根据位置信息查看每一个分区的值。调用 makeRDD()时不可以直接指定RDD的分区个数,分区的个数与Seq[String]参数的个数是保持一致的。

        

Spark 基础实验 spark编程基础实验4答案_数据_05

2.1.2从外部存储系统中读取数据创建RDD

        从外部存储系统中读取数据创建RDD是指直接读取存放在文件系统中的数据文件创建RDD。从内存中读取数据创建RDD的方法常用于测试,从外部存储系统中读取数据创建RDD才是用于实践操作的常用方法。
        从外部存储系统中读取数据创建RDD的方法可以有很多种数据来源,可通过SparkContext对象的textFile()方法读取数据集。textFile()方法支持多种类型的数据集,如目录、文本文件、压缩文件和通配符匹配的文件等,并且允许设定分区个数,分别读取HDFS文件和Linux本地文件的数据并创建RDD,具体操作如下。

(1)通过HDFS 文件创建RDD
        这种方式较为简单和常用,直接通过textFile()方法读取HDFS文件的位置即可。在HDFS的/user/root目录下有一个文件test.txt,读取该文件创建一个RDD。

val test = sc.textFile("/user/root/test.txt")

(2)通过Linux本地文件创建RDD
        本地文件的读取也是通过sc.textFile(“路径")的方法实现的,在路径前面加上“file://”表示从Linux本地文件系统读取。在IntelliJ IDEA开发环境中可以直接读取本地文件;但在 spark-shell中,要求在所有节点的相同位置保存该文件才可以读取它,例如,在 Linux的/opt目录下创建一个文件 test.txt,任意输入4行数据并保存,将test.txt文件远程传输至所有节点的/opt目录下,才可以读取文件test.txt。
    

#读取本地文件 test,txt
                 val test = sc.textFile("file:///opt/test.txt")
                 #统计test.txt文件的数据行数
                 test.count

2.2RDD的两种类型操作

2.2.1转换操作

        RDD支持两种类型的操作,分别为转换(Transformation)操作和行动(Action)操作,foreach(也称为转换算子和行动算子。转换操作主要是指将原始数据集加载为RDD数据或将一个 表RDD转换为另外一个RDD的提作,行动操作主要指将RDD 存储至硬盘中或触发转换操作 过Spar执行的操作。例如,man)方法是一个转换操作,作用于RDD上的每一个元素,并且返回 所一个新的RDD作为结果:0dace0方法是一个行动操作,该操作通过一些函数聚合RDD中上执行的所有元素并且返回最终的结果。
        常用的转换操作有map()、filter()、flatMap()、union()、groupByKey()、reduceByKey()
等方法。

转换操作

描述

map(func)

对RDD中的每个元素都使用func,返回一个新的RDD。

filter(func)

对RDD中的每个元素都使用func,返回使func为true的元素构成

的RDD。

flatMap(func)

和map()类似,但是flatMap()生成的是多个结果。

union(otherDataset)

接收另一个RDD数据集 otherDataset作为参数返回一个新的RDD,包含源dataset和给定otherDataset的元素的集合。

groupByKey(num Tasks)

作用于键值RDD,可根据相同的键分组。返回一个(K,Seq[v])类型的 数据集。默认情况下,使用8个并行任务进行分组,也可传入一个可选参数numTask,根据数据量设置并行任务数。

reduceByKey(func,[numTasks])

用一个给定的func作用在 groupByKey()产生的(K,Seq[V])类型的数据集,如求和。和groupByKey()类似,并行任务数量可以通过一个可选参数 numTasks 进行配置。

2.2.2行动操作

        常用的行动操作有reduce()、collect()、count)、first)、take()、saveAsTextFile()、foreach()等方法。

行动操作

描述

reduce(func)

通过函数func聚集数据集中的所有元素。func函数接收两个参数,返回一个值。

collect()

返回数据集中所有元素。

count(n)

返回数据集中所有元素个数。

first(n)

返回数据集中第一个元素。

take(n)

返回前n个元素。

saveAsTextFile(path)

接收一个保存路径path作为参数,将数据集的元素以文本(Textfile)的形式保存到本地文件系统、HDFS 或任何其他 Hadoop 支持的文件系统。Spark 将会调用每个元素的toString)方法,并将它转换为文件中的一行文本。

foreach(func)

对数据集中的每个元素都执行函数func。

 2.2.3使用map()方法转换数据

        map()方法是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD。map)方法是懒操作,不会立即进行计算。
        转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD。例如,通过一个存放了5个Int类型的数据元素的列表创建一个RDD,可通过map()方法对每一个元素进行平方运算,结果会生成一个新的RDD。

Spark 基础实验 spark编程基础实验4答案_spark_06

2.2.4使用sortBy()方法进行排序

sortBy()方法用于对标准 RDD进行排序,有3个可输人参数,说明如下。
(1)第1个参数是一个函数 f:(T)=>K,左边是要被排序对象中的每一个元素,右边返
回的值是元素中要进行排序的值。
(2)第2个参数是ascending,决定排序后 RDD 中的元素是升序的还是降序的,默认
是 true,即升序排序,如果需要降序排序则需要将参数的值设置为 false。
(3)第3个参数是numPartitions,决定排序后的RDD的分区个数,默认排序后的分区
个数和排序之前的分区个数相等,即 this.partitions.size。
第一个参数是必须输人的,而后面的两个参数可以不输人。例如,通过一个存放了 3
个二元组的列表创建一个 RDD,对元组的第二个值进行降序排序,分区个数设置为 1。

2.2.5 使用collect()方法查询数据

        collect()方法是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端。适用于返回处理后的少量数据。因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。collect()方法有以下两种操作方式。
        (1) collect:直接调用collect返回该RDD中的所有元素,返回类型是一个ArraylT]数组,这是较为常用的一种方式。使用collect()方法查看sq_dist和sort_data的结果,结果如图3-3所示,分别返回了经过平方运算后的Int类型的数组和对元组第二个值进行降序排列后的数组。        

        (2)collect[U:ClassTag](f: PartialFunction[T, U]):RDD[U]。这种方式需要提供一个标准的偏函数,将元素保存至一个RDD中。首先定义一个函数one,用于将collect方法得到的数组中数值为1的值替换为“one”,将其他值替换为“other”。创建一个只有3个 Int类型数据的RDD,在使用collect()方法时将one函数作为参数。

2.2.6 使用flatMap()转换数据

        flatMap()方法将函数参数应用于 RDD 之中的每一个元素,将返回的选代器(如数组列表等)中的所有元素构成新的RDD。使用flatMap()方法时先进行 map(映射)再进行flat(扁平化)操作,数据会先经过跟 map()方法一样的操作,为每一条输人返回一个迭代器(可迭代的数据类型 ),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的 RDD。这个转换操作通常用来切分单词。例如,分别用 map()方法和 flatMap()方法分制字符串。用map()方法分割后,每个元素对应返回一个迭代器,即数组。flatMap()方法在进行同 map()方法一样的操作后,将3个代器的元素扁平化(压成同一级别),保存在新 RDD中。

2.2.7 使用take()方法查询某几个值

         take(N)方法用于获取RDD的前N个元素,返回数据为数组。take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。

2.2.8使用union()方法合并多个RDD

        union()方法是一种转换操作,将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。

Spark 基础实验 spark编程基础实验4答案_数据_07

Spark 基础实验 spark编程基础实验4答案_分布式_08

2.2.9 使用filter()方法进行过滤

       filter()方法是一种转换操作,用于过滤RDD中的元素。filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD。

Spark 基础实验 spark编程基础实验4答案_spark_09

2.2.10使用distinct()进行去重

distinct()方法用于RDD的数据去重,去除两个完全相同的元素,没有参数。

下列为创建一个带有重复数据的RDD,并使用distinct()方法去重。

Spark 基础实验 spark编程基础实验4答案_spark_10

2.3 集合操作 

2.3.1intersection()方法

intersection()方法用于求出两个RDD的共同元素,即找出两个RDD的交集,参数是另一个RDD,先后顺序与结果无关。

2.3.2cartesian()方法

cartesian()方法可将两个集合的元素两两组合成一组,即求笛卡儿积。

2.3.3subtract()方法

subtract()方法用于将前一个RDD中在后一个RDD出现的元素删除,可以认为是求补集的操作,返回值为前一个RDD去除与后一个RDD相同元素后的剩余值所组成的新的RDD,两个RDD的顺序会影响结果。

1.3任务实现

Spark 基础实验 spark编程基础实验4答案_大数据_11

Spark 基础实验 spark编程基础实验4答案_分布式_12

三、spark SQL--结构化数据文件处理

3.1 了解spark SQL概念

        Spark SQL 是一个用于处理结构化数据的框架,可被视为一个分布式的 SQL查询引擎提供了一个抽象的可编程数据模型 DataFramc。Spark SQL 框架的前身是 Spark 框,由于Spark需要依赖于 Hive,这制约了 Spark 各个组件的相互集成,因此 Spark 团队提出了 Spark SQL项目。Spark SQL 借鉴了 Spark 的优点,同时摆脱了对 Hive 的依赖。相对于 Spark SQL在数据兼容、性能优化、组件扩展等方面更有优势。Spark SQL 在数据兼容方面的发展,使得开发人员不仅可以直接处理 RDD,还可以处理 Parquet文件或JSON文件,甚至可以处理外部数据库中的数据、Hive中存在的表数据,Spark SQL 的一个重要特点是能够统一处理关系表数据和 RDD 数据。

Spark SQL主要提供了以下三个功能:

(1) Spark SQL可从各种结构化数据源中读取数据,进行数据分析。

(2) Spark SQL包含行业标准的JDBC和ODBC连接方式,因此它不局限于在Spark程序内使用SQL语句进行查询。

(3) Spark SQL可以无缝地将SQL查询与Spark程序进行结合,它能够将结构化数据作为Spark中的分布式数据集(RDD)进行查询。

        

3.2 Spark SQL的运行过程 

         Spark SQL 提供的核心的编程数据模型是DataFrame。DataFrame 是一个分布式的Row 对象的数据集合,实现了 RDD的绝大多数功能。Spark SQL 通过 SparkSession 人口对象提供的方法可从外部数据源如Parquent 文件、JSON 文件、RDDs、Hive表等加载数据为 DataFrame,再通过
DataFrame 提供的API接口、DSL(领城特定语言)、spark-shell、spark-sql 或 ThriftServer等方式对Data Frame数据进行查询转换等操作,并将结果展现出来或使用save()、saveAsTable()方法将结果存储为不同格式的文件。

3.3 掌握DateFrame基础

        Spark SOL 提供了一个抽象的编程数报资型 DataFmme, DateFrame 是由schemaRDD发展而来的,从 Spark 1.3.0 开始,SchemaRDD 更名为DateFrame,SchemaRDD直接继承自 RDD,而 DataFrame 则自身实现RDD的绝大多数功能。可以将 Spark SQL的 DataFrame理解为一个分布式的Row对象的数据集合,该数据集合提供了由列组成的详细模式信息。

3.3.1 创建DateFtame对象

        DateFrame 可以通过结构化数据文件、外部数据序、Spark 计算过程中生成RDD,Hive中的表进行创建。不同数据源的数据转换成 DateFrame 的方式也不同。

(1)通过结构化数据文件创建 DataFrame:

        一般情况下,结构化数据文件存储在 HDFS 中,较为常见的结构化数据文是P文件或JSON 文件。Spark SQL 可以通过 load0方法将 HDFS 上的结构化文件数据转DataFrame,load()方法默认导人的文件格式是Parquet。

(2)通过外部数据库创建 DataFrame:
        Spark SOL 还可以通过外部数据库 ( 如MySQL、Oracle 数据库)例建 DataPrame,使用该方式创建 DataFrame 需要通过 Java 数据库近连(Javh Database Connectivity,DBC连接成开放式数据库互连(Open Database Connectivity,ODBC)连接的方式访同数据库。MySOL 数据库的表数据为例,将 MySQL 数据库 est 中的 people 表的数据转换为 DateFrame。

Spark 基础实验 spark编程基础实验4答案_Spark 基础实验_13

(3)通过RDD 创建 DataFrame:
        通过 RDD数据创建 DataFrame 有两种方式。第一种方式是利用反射机制推断 RDD模式,首先需要定义一个样例类,因为只有样例类才能被 Spark 隐式地转换为 DataFrame。将/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources 目录下的 people.txt 文件上传至HDFS 的/user/root/sparkSql 目录下。读取 HDFS 上的 peoplext 文件数据创建 RDD。

Spark 基础实验 spark编程基础实验4答案_spark_14

        第二种方式是采用编程指定 Schema 的方式将 RDD转换成 DataFrame,实现步骤如下
        (1)加载数据创建 RDD
        (2)使用 StructType 创建一个和步骤(1)的 RDD中的数据结构相匹配的 Schema。
        (3)通过 createDataFrame0()方法将 Schema 应用到 RDD 上,将 RDD 数据转换为DataFrame。

(4)通过 Hive 中的表创建 DataFrame:
        通过 Hive 中的表创建 DataFrame,可以使用 SparkSession 对象使用SparkSession对象并调用 sql()方法查询 Hive 中的表数据并将其转换成DataFrame,如查询 test数据库中的 people 表数据并将其转换成 DtaFrame。

Spark 基础实验 spark编程基础实验4答案_分布式_15

3.4查看DateFrame数据

3.4.1printSchema:输出数据模式

        创建 DataFrame 对象后,一般会查看 DataFrame 的数据模式。使用 printSchema 函数可
查看 DataFrame 数据模式,输出列的名称和类型。

Spark 基础实验 spark编程基础实验4答案_大数据_16

3.4.2show()查看数据

方法

说明

show()

显示前20条记录

show(numRows:Int)

显示numRows条记录

show(truncate:Boolean)

是否最多只显示20个字符,默认为true

show(numRows:Int,truncate:Boolean)

显示numRows条记录并设置过长字符串的显示格式

        使用 show0方法查看 DataFrame 对象 movies 中的数据,show()方法与 show(true)方
查询到的结果一样,只显示前 20 条记录,并且最多只显示 20 个字符。如果需要显示所有
字符,那么需要使用 show(false)方法。

Spark 基础实验 spark编程基础实验4答案_大数据_17

        show()方法默认只显示前 20 条记录。若需要在看前 numRows 条记录则可以使用未
(numRows:In)方法,如通过“movies.show(5)”命令查看 moies 前 5 条记录。

Spark 基础实验 spark编程基础实验4答案_分布式_18

3.4.3 first()/head()/take()/takeAsList():获取若干条记录

        获取 DataFrame若干条记录除了使用 show()方法之外,还可以使用 first(),head(),take(),
takeAsList()方法。

方法

解释

first()

获取第一条记录

head(n:Int)

获取前n条记录

take(n:Int)

获取前n条记录

takeAsList(n:Int)

获取前n条记录,并以列表的形式展现

分别使用 first()、head()、take()、takeAsList()方法查看 movies 中前几条记录,first()和 head()方法的功能类似,以 Row 或Array[Row]的形式返回一条或多条数据。take()和 takeAsList()方法则会将获得的数据返回 Driver 端,为避免Driver 提示OutofMemoryError,数据量比较大时不建议使用这两个方法。

Spark 基础实验 spark编程基础实验4答案_分布式_19

3.4.4collect()/collectAsList(): 获取所有数据

        collect()方法可以查询 DataFrame 中所有的数据,并返回一个数组,collectAsList()方法
和 collect()方法类似,可以查询 DataFrame 中所有的数据,但是返回的是列表。分别使用
collect()和 collectAsList()方法查看 movies 所有数据。

Spark 基础实验 spark编程基础实验4答案_数据_20

3.5 DateFrame查询

        DateFrame查询数据有两种方法,第一种是将 DataFrame 注册成临时表,再通过 SQL
语查询数据。第二种方法是直接在 DataFrame 对象上进行查询。DataFrame 提供了很多查询数据的方法,类似与SparkRDD的转换操作,DateFrame的查询操作也是懒操作,仅仅生成查询计划,只有触发行动操作才会进行计算并返回结果。

方法

描述

where()/filter()

条件查询

select()/selectExpr()/col()/apply()

查询指定字段的数据信息

limit()

查询前n条记录

order By()/sort()

排序查询

groupBy()

分组查询

join()

连接查询

3.5.1 where()/filter()方法

使用 where()或 filter()方法可以查询数据中符合条件的所有字段的信息。
(1) where()方法
DataFrame 可以使用 where(conditionExpr;String)方法查询符合指定条件的数据,参数可以使用and或or where()方法的返回结果仍然为 DataFrame。询 user 对象中性别为且年龄为 18 岁的用户信息。

Spark 基础实验 spark编程基础实验4答案_大数据_21

(2) flter()方法
DataFrame 还可以使用 flter()方法筛选出符合条件的数据,使用 filter()方法查询 use
对象中性别为女且年龄为 18 的用户信息。

3.5.2 select()/selectExpr()/col()/apply()方法

where()和 flter()方法查询的数据包含的是所有字段的信息,但是有时用户只需要有部分字段的值即可,DataFrame 提供了查询指定字段的值的方法,如 selet()、selectExmr(),col()和apply()方法等,用法介绍如下。

(1) select()方法:获取指定字段值
sclect()方法根据传入的 String 类型字段名获取对应的值,并返回一个 DataFrame对查询user 对象中 userId 和 gender 字段的数据。

Spark 基础实验 spark编程基础实验4答案_大数据_22

(2)selectExpr()方法:对指定字段进行特殊处理
在实际业务中,可能需要对某些字段进行特殊处理,如为某个字圆别名、对某个字段的数据进行四舍五人等。DataFrame 提供了 selectExpr()方法,可以对指定字段取别名或调用 UDF 函数对其进行其他处理selectExpr()方法传人 String类型的参数,返回一个 DataFrame对象。例如,定义一个函数 replace,对 user 对象中 gender 字段的值进行转换。

(3)col()/apply()方法
col()和 apply()方法也可以获取 DataFrame 指定字段,但只能获取一个字段,并且返回的是一个 Column 对象。分别使用 col()和apply()方法查询 user 对象中 zip 字段的数据。

Spark 基础实验 spark编程基础实验4答案_spark_23

3.5.3limit()方法

limit()方法可以获取指定 DateFrame 数据的前n条记录。不同于take()与 head()方法,limit()方法不是行动操作,因此并不会直接返回查询结果,需要结合站show()方法或其他行动操作才可以显示结果。使用 limi()方法询 usr 对象的前 3 条记录,并使用 show()方示查询结果。

Spark 基础实验 spark编程基础实验4答案_spark_24

3.5.4.orderBy()/sort()方法

        orderBy()方法用于根据指定字段对数据进行排序,默认为升序排序。若要求降序排序,orderBy()方法的参数可以使用“desc("字段名称")”或“$"字段名称"desc”,也可以在撤字段前面加“-”。使用orderBy()方法根据 userId 字段对 user 对象进行降序排序。

        sort()方法也可以根据指定字段对数据进行排序,用法与 orderBy()方法一样。使用 sort()
方法根据 userId 字段对 user 对象进行升序排序。

Spark 基础实验 spark编程基础实验4答案_分布式_25