spark算子集锦

Spark 是大数据领域的一大利器,花时间总结了一下 Spark 常用算子,正所谓温故而知新。

Spark 算子按照功能分,可以分成两大类:transform 和 action。Transform 不进行实际计算,是惰性的,action 操作才进行实际的计算。如何区分两者?看函数返回,如果输入到输出都是RDD类型,则认为是transform操作,反之为action操作。

准备

准备阶段包括spark-shell 界面调出以及数据准备。spark-shell 启动命令如下:

bin/spark-shell --master local[*]

其中local[*]是可以更改的,这里启用的是本地模式,出现下面这个界面,恭喜,可以开撸了!
spark-shell_page
有一点需要说明,sc 和 spark 可以直接在命令行调用,其提示信息如下:

Spark context available as ‘sc’ (master = local[*], app id = local-1547409645312).

Spark session available as ‘spark’.

数据准备

val content =Array("11,Alex,Columbus,7","12,Ryan,New York,8","13,Johny,New York,9","14,Cook,Glasgow,6","15,Starc,Aus,7","16,eric,New York,4","17,richard,Columbus,3")

数据加载和处理

val test_tmp_RDD =sc.parallelize(content).map(line =>line.split(","))

val format_RDD = test_tmp_RDD.map{arr=>
      val line = (arr(0).toString,arr(1).toString,arr(2).toString,arr(3).toString)
      line match{
        case (eid,name,destination,salary) =>(eid,name,destination, salary)
      }
    }

处理后的结果输出如下:
foreach_output

Spark 类型转换

通过命令行输入 format_RDD. 加 tab键,可以显示当前可用的操作,图示如下:
spark算子
其中 toDF方法能将 RDD 转换成 DataFrame,RDD 转换成 DataFrame 需要隐式转换,需要引入的包如下:

import spark.implicits._

当用 toDF 方法输出后显示如下:
dataframe_output
我们尝试带着问题去寻找合适的spark算子,以期达到预想效果。

问一:如何将列名(_1,_2,_3,_4)改成对应的精确的描述信息?

命令行输入 format_RDD.toDF. 加 tab键,显示当前可操作算子如下:
dataframe_算子
注意 RDD 算子和 DataFrame 算子的不同,我们找到withColumnRenamed方法,尝试操作如下:
withColumnRenamed算子
该算子能达到我们预期的效果,另一种方式,toDF函数后面可以直接接列名字符,其定义如下:

def toDF(colNames: String*): DataFrame = ds.toDF(colNames : _*)

更一般的,我们在数据处理阶段,直接将RDD 转换成 DataFrame,需要引入的包如下:

import org.apache.spark.sql.{DataFrame, SparkSession,Row}
import org.apache.spark.sql.types._

需要预先定义一个 StructType,其实现如下:

val schema = StructType(
      Array(
        StructField("eid",StringType,true)
        ,StructField("name",StringType,true)
        ,StructField("destination",StringType,true)
        ,StructField("salary",StringType,true)
      )
    )

将 format_RDD的每一行包装成 Row类型,其实现如下:

val format_df_row = format_RDD.map{arr=>
      arr match{
        case (eid,name,destination,salary) =>Row(eid,name,destination, salary)
      }
    }

通过 SparkSession 创建 DataFrame,其实现方式如下:

val df = spark.createDataFrame(format_df_row,schema)

结果展示1

DataFrame 算子

我们可以把 DataFrame 当成数据库中的一张表,对其进行分析和操作。

  • drop 操作,删除特定列。
    drop_操作
  • printSchema 操作,打印概要
    printSchema
  • 对 DataFrame 中的列进行统计分析,包括:count,mean,std,min,max
    describe_output
  • 将表存成字符串JSON,其操作如下:
    df2JSON
  • 计算每个地方(destination) 上的最高薪水(salary)
    在这里插入图片描述

今天的内容就到这里,后续或有更新…

posted @ 2019-03-09 21:47  卅先生  阅读(600)  评论(0)    收藏  举报