Spark高级数据分析常用知识点

  • spark框架是用scala语言编写的,在向数据科学家介绍spark时,采用与底层框架相同的编程语言有很多好处。
  • 编写Spark程序通常包含以下步骤
    ①在输入数据集上定义一组转换
    ②调用action,可以将转换后的数据集保存到持久化存储上,或者把结果返回到驱动程序的本地内存
    ③运行本地计算,处理分布式的计算结果。本地计算有助于确定下一步转换和action
  • 从资料库中下载数据
    curl -L -o donation. zip http://bit.ly/1Aoywoq
  • 解压zip包
    unzip doration. zip或通配’block_*.zip’
  • spark运行在yarn(在集群上启动yarn)
    spark-shell --master yarn --depdoy-mode client
  • SC是SparkContext类的一个对象
    RDD是spark所提供的最基本抽象, RDD的创建方式有两种, 一种是用用sparkContext基于外部数据源创建RDD ,外部教据源包括HDFS上的文件,通过JDBC访问的数掘库表或Sprk Shell中创建的本地对象集合。另一种是在已有RDD上执行转换操作来创建RDD
  • RDD以分区的形式分布在集群中的多f机器上,每个分区代表了数据集的一个子集。
  • 创建本地对象集合
    val rdd= SC. paralelize(Array(1,2,3,4),4),参数2表示分区个数
  • 在分布式文件系统上创建RDD
  • var rdd=sc. textFile("hdfs:///some/path.txt)
  • 切片:当要对分区内的对象进行计算时, spark会读入输入文件的某个部分,然后再做其它操作
  • 类型推断:在创建RDD时,无需声明变量类型,Scala会尽可能从上下文分析出变量类型
  • 把数据从集群上获取到客户端
    rdd.first ; rod.take(10) ; rdd.take(10).length;rdd. foreach (println)
  • 过滤记录(文件标题)
    def isHeader (line : String)=line.contains("id_1’’)
    def isHeader (line : String):Bolean= { line.contains (“id_1”) }
  • 返回除标题外的所有记录
    rdd.filterNot( isHeder). length
    rdd.filterNot (x =>! isHeader(x)).length
    rdd.filter(! isHeader(_)).length
  • PataFrome是一个构建在RDD之上的spark抽象,它专门为结构规整的数据集设计。要为记录关联数据集建立一个DataFrame ,用SparkSession替代SQLContext,Sparkession是SporkContext对象的一个封装,可通过SparkSession访问到sparkContext.
  • 创建DataFrame
    var prev= spark.read.csv(“目录或文件”)
  • 查看DataFrame
    prev.show(10)
  • 空值和真假映射
    var pared=spark.read.option ("header ‘’,“oue”).option( “nullValne’’, ‘’?”). option("inferSchema’’,“true”).csv
  • 用dataframe API分析数据
    统计记录df.count()
  • 缓存df到内存:df.cache()
  • df分组统计
    法一:df.rdd.map(_.getAs[Boolean] (’‘is_match’’)).countByValue()
    法二:df.groupBy(’‘is_match’’).count().orderBy($’‘count’’.desc)show()
  • df的聚合函数agg,如求最大最小值均值标准差
    df.agg(avg($ ‘‘cmp_sex’’), stddev($ ‘‘cmp_sex’’)).show()
  • 根据df创建SQL数据表
    df.createOrReplaceTempView(’‘表名’’)
    使用spark.sql(sql语句).show()即可作查询
  • df的describe函数统计所以非空值列的最值平均值标准差
    df.describe().show()
  • df过滤值
    yes.where(’‘is_match=true’’)
    miss.filter($’‘is_match’’===false)
  • 宽表转长表(df转长表)

    以上代码片段做了很多事情,让我们逐行进行分析。对DataFrame类型的summary的每行,我们通过调用row.getString(0)来依据位置获得这个指标的名称。对于这一行中位置1后的其他列,我们调用flatMap操作,生成了一个元组序列。元组中第个条目是指标的名称,第二个条目是列的名字(通过schema(i).name对象获取),第三个条目是统计量的值,我们用强制类型转换将row.getString(i)方法获取的字符串解析成一个双精度浮点数。
  • 长表转宽表(长表转df)
    var longDF=longform.toDF(’‘metric’’, ‘‘field’’, ‘‘value’’)
  • 将df转化为数据集dataset
    先创建一个类
    case class 类名(
    与df中列名一一对应
    格式:列名: 数据类型
    )
    dataset = df.as[类名]

你可能感兴趣的:(大数据)