spark算子集锦
Spark 是大数据领域的一大利器,花时间总结了一下 Spark 常用算子,正所谓温故而知新。
Spark 算子按照功能分,可以分成两大类:transform 和 action。Transform 不进行实际计算,是惰性的,action 操作才进行实际的计算。如何区分两者?看函数返回,如果输入到输出都是RDD类型,则认为是transform操作,反之为action操作。
准备
准备阶段包括spark-shell 界面调出以及数据准备。spark-shell 启动命令如下:
bin/spark-shell --master local[*]
其中local[*]是可以更改的,这里启用的是本地模式,出现下面这个界面,恭喜,可以开撸了!

有一点需要说明,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)
}
}
处理后的结果输出如下:

Spark 类型转换
通过命令行输入 format_RDD. 加 tab键,可以显示当前可用的操作,图示如下:

其中 toDF方法能将 RDD 转换成 DataFrame,RDD 转换成 DataFrame 需要隐式转换,需要引入的包如下:
import spark.implicits._
当用 toDF 方法输出后显示如下:

我们尝试带着问题去寻找合适的spark算子,以期达到预想效果。
问一:如何将列名(_1,_2,_3,_4)改成对应的精确的描述信息?
命令行输入 format_RDD.toDF. 加 tab键,显示当前可操作算子如下:

注意 RDD 算子和 DataFrame 算子的不同,我们找到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)

DataFrame 算子
我们可以把 DataFrame 当成数据库中的一张表,对其进行分析和操作。
- drop 操作,删除特定列。
![drop_操作]()
- printSchema 操作,打印概要
![printSchema]()
- 对 DataFrame 中的列进行统计分析,包括:count,mean,std,min,max
![describe_output]()
- 将表存成字符串JSON,其操作如下:
![df2JSON]()
- 计算每个地方(destination) 上的最高薪水(salary)
![在这里插入图片描述]()
今天的内容就到这里,后续或有更新…






浙公网安备 33010602011771号