spark简介

Spark 的主要抽象是分布式的元素集合(distributed collection of items),称为RDD(Resilient Distributed Dataset,弹性分布式数据集),它可被分发到集群各个节点上,进行并行操作。RDDs 可以通过 Hadoop InputFormats 创建(如 HDFS),或者从其他 RDDs 转化而来。

Spark安装步骤

Spark官网下载地址:http://spark.apache.org/downloads.html

tar -zxf spark-3.0.0-preview-bin-hadoop3.2.tgz #解压
mv spark-3.0.0-preview-bin-hadoop3.2 spark #修改名称
chown -R hadoop:hadoop spark #授权
cp spark/conf/spark-env.sh.template spark/conf/spark-env.sh #复制一个配置文件
vim conf/spark-env.sh #编辑配置文件,加入spark的classpath,如下:
export SPARK_DIST_CLASSPATH=$(/usr/local/soft/hadoop/bin/hadoop classpath)
./bin/spark-shell #启动spark shell,如下是启动成功的样式

spark必须要在Hadoop集群上吗 spark集成hadoop_spark

基本操作

val textFile = sc.textFile("file:///usr/local/soft/spark/README.md") #通过file:前缀指定读取本地文件,读取本地README文件加载到rdd中
textFile.count() #action API -count()统计该文本文件的行数
textFile.first() #RDD中的第一个item,对于文本文件,就是第一行内容
val linesWithSpark = textFile.filter(line => line.contains("Spark")) #transformation API - filter()筛选出包含Spark的行
linesWithSpark.count() #统计行数
textFile.filter(line => line.contains("Spark")).count() #可以在同一条代码中同时使用多个api,连续进行运算,不仅可以使spark代码更加简洁,也优化了计算过程。

spark必须要在Hadoop集群上吗 spark集成hadoop_spark_02

RDDs 支持两种类型的操作

  • actions: 在数据集上运行计算后返回值
  • transformations: 转换, 从现有数据集创建一个新的数据集

Spark提供了非常丰富的API, 下面两表格列出了几个常用的动作、转换API,更详细的API及说明可查阅官方文档。

                                                               表1 常用的Action API

Action API

说明

count()

返回数据集中的元素个数

collect()

以数组的形式返回数据集中的所有元素

first()

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

take(n)

以数组的形式返回数据集中的前n个元素

reduce(func)

通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

foreach(func)

将数据集中的每个元素传递到函数func中运行

                                                             表2 常用的Transformation API

Transformation API

说明

filter(func)

筛选出满足函数func的元素,并返回一个新的数据集

map(func)

将每个元素传递到函数func中,并将结果返回为一个新的数据集

flatMap(func)

与map()相似,但每个输入元素都可以映射到0或多个输出结果

groupByKey()

应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable<V>)形式的数据集

reduceByKey(func)

应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个

值是将每个key传递到函数func中进行聚合

Spark SQL和DataFrames

Spark SQL 是 Spark 内嵌的模块,用于结构化数据。在 Spark 程序中可以使用 SQL 查询语句或 DataFrame API。DataFrames 和 SQL 提供了通用的方式来连接多种数据源,支持 Hive、Avro、Parquet、ORC、JSON、和 JDBC,并且可以在多种数据源之间执行 join 操作。

 

val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json") #导入数据源
df.show() #输出数据源内容
df.select("name").show() #DataFrames处理结构化数据的操作,只显示name列
df.select(df("name"),df("age")+1).show() #将“age”加1
df.filter(df("age")>21).show() #过滤出年龄大于21岁的数据

spark必须要在Hadoop集群上吗 spark集成hadoop_API_03

spark必须要在Hadoop集群上吗 spark集成hadoop_spark必须要在Hadoop集群上吗_04

使用sql语句进行操作

将DataFrame注册为临时表people

df.createOrReplaceTempView("people") #spark2.x以上写法
df.registerTempTable("people) #spark1.6以下版本写法
spark.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19").show() #执行sql语句,

并输入结果

 

问题和解决

1、启动spark shell的时候,报错:Exception in thread "main" java.lang.NoSuchMethodError: jline.console.completer.CandidateListCompletionHandler.setPrintSpaceAfterFullCompletion(Z)V

spark必须要在Hadoop集群上吗 spark集成hadoop_spark必须要在Hadoop集群上吗_05

解决方法:下载的spark版本不正确,需要下载和hadoop对应的版本

例如,本环境使用的是hadoop-3.2.1版本,因此,需要下载的spark版本为

spark必须要在Hadoop集群上吗 spark集成hadoop_spark_06

2、error: not found: value sqlContext(参考文章:)

解决方法:

spark2.x.x之前的版本,执行的命令如下:

val df = sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")

spark2.x.x之后的版本,执行的命需要加上spark,若还用之前的语句,就会出现此错误:

val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")