Hadoop系列之Spark安装和使用(四)

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,如下是启动成功的样式

基本操作

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代码更加简洁,也优化了计算过程。

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岁的数据

使用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对应的版本

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

2、error: not found: value sqlContext(参考文章:https://blog.csdn.net/BigData_Mining/article/details/80104694

解决方法:

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")

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值