Spark介绍

 

基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,

hadoopI/O的效率往往较低,从而影响了MapReduce的运行速度。Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,弥补MapReduce的不足。

spark四大核心组件

主要有Spark SQL、Spark Streaming、MLlib、GraphX。

1.Spark SQL

Spark SQL是Spark用来操作结构化数据的组件。支持多种数据源类型,如Hive表、Parquet以及JSON等。Spark SQL不仅为Spark提供了一个SQL接口,还支持开发者将SQL语句融入到Spark应用程序开发过程中,用户可以使用SQL或HQL来查询数据。

2.Spark Streaming

Spark Streaming是Spark平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流的API。

3.MLlib

MLlib是Spark提供的一个机器学习算法库,其中包含了多种经典常见的机器学习算法,主要有分类、回归、聚类、协同过滤等。

4.GraphX

GraphX是Spark面向图计算提供的框架与算法库。GraphX中提出了弹性分布式属性图的概念。

RDD

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,可并行计算的集合

. RDD的创建方式

  • 通过外部的数据文件创建,如HDFS:
    • val rdd1 = sc.textFile(“hdfs://XXXX:9000/data.txt”)
  • 通过sc.parallelize进行创建:
    • val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))

所有转换都是延迟加载的,记住转换动作后,发生一个要求返回结果给Driver的动作时,这些转换才会真正运行

  val rdd1 = sc.parallelize(List(5, 6, 4, 7, 3, 8, 2, 9, 1, 10))//通过并行化生成rdd
  val rdd2 = rdd1.map(_ * 2).sortBy(x => x, true)//对rdd1里的每一个元素乘2然后排序
  val rdd3 = rdd2.filter(_ >= 10) //过滤出大于等于十的元素
  rdd3.collect //将元素以数组的方式在客户端显示

  val rdd1 = sc.parallelize(Array("a b c", "d e f", "h i j"))
  val rdd2 = rdd1.flatMap(_.split(' '))  //将rdd1里面的每一个元素先切分在压平
  rdd2.collect
  
  val rdd5 = rdd1.union(rdd2)
  val rdd5 = rdd3.reduceByKey(_ + _)  
  val rdd5 = rdd4.map(t => (t._2, t._1)).sortByKey(false).map(t => (t._2, t._1))

Spark SQL

  • Hive是将HQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序的复杂性,但是MapReduce这种计算模型执行效率比较慢。所以Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快,同时Spark SQL也支持从Hive中读取数据,Hive 2.x 执行引擎可以使用Spark。

基本概念:Datasets和DataFrames

Dataset API 支持Scala和Java。DataFrame API支持的语言有Scala,Java,Python和R

DataFrames创建方式:1通过Case Class:读入RDD再转换成DataFrames 2用SparkSession 3使用JSon文件

(参考:https://juejin.im/post/5cd16c00e51d453a51433062#heading-45

df.createOrReplaceTempView("emp") #需要生成一个视图  /createGlobalTempView
spark.sql("select * from emp").sho

SparkSession

其为用户提供了一个统一的切入点来使用Spark的各项功能,并且允许用户通过它调用DataFrame和Dataset相关API来编写Spark程序。使得我们可以很容易地与Spark交互。SparkConf, SparkContext 以及 SQLContext这些对象已经封装在SparkSession中,不需要再显式地创建

ew SparkContext(new SparkConf().setAppName("DoubanRecommender"))

例子

import scala.collection.Map

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.mllib.recommendation._
import org.apache.spark.rdd.RDD
case class MovieRating(userID: String, movieID: Int, rating: Double) extends scala.Serializable

object DoubanRecommender {

  def main(args: Array[String]): Unit = {
    val sc = new SparkContext(new SparkConf().setAppName("DoubanRecommender"))
    //val base = "/opt/douban/"
    val base = if (args.length > 0) args(0) else "/opt/douban/"

    //获取RDD  :sc.textFile
    val rawUserMoviesData = sc.textFile(base + "user_movies.csv")
    val rawHotMoviesData = sc.textFile(base + "hot_movies.csv")

    //准备数据
    preparation(rawUserMoviesData, rawHotMoviesData)
    println("准备完数据")

    //model(sc, rawUserMoviesData, rawHotMoviesData)

    //evaluate(sc,rawUserMoviesData, rawHotMoviesData)

    recommend(sc, rawUserMoviesData, rawHotMoviesData,base)
  }

spark.ml.feature

Spark机器学习之特征提取、选择、转换

在spark中提供了两个机器学习库mllib和ml,mllib的操作是基于RDD的,而ml则是基于DataFrame,是主流机器学习库。

ml包括三个主要的抽象类:转换器(Transformer)评估器(Estimator)和管道(Pipeline)spark.ml.feature中提供了许多转换器

学习:https://www.jianshu.com/p/20456b512fa7

http://spark.apache.org/docs/latest/api/python/_modules/pyspark/ml/feature.html

from pyspark.ml.feature import HashingTF, IDF, Tokenizer
sentenceData = spark.createDataFrame([
    (0.0, "Hi I heard about Spark"),
    (0.0, "I wish Java could use case classes"),
    (1.0, "Logistic regression models are neat")
    ],["label", "sentence"])
tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)
 
hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
featurizedData = hashingTF.transform(wordsData)
#CountVectorizer也可以用于获得项频率向量
idf = IDF(inputCol="rawFeatures", outputCol="features")
idfModel = idf.fit(featurizedData)
rescaledData = idfModel.transform(featurizedData)
 
rescaledData.select("label", "features").show()
rescaledData.take(1)
输出:
[Row(label=0.0, sentence='Hi I heard about Spark', words=['hi', 'i', 'heard', 'about', 'spark'],
rawFeatures=SparseVector(20, {0: 1.0, 5: 1.0, 9: 1.0, 17: 2.0}), features=SparseVector(20, {0: 0.6931, 5: 0.6931, 9: 0.2877, 17: 1.3863}))]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值