学习目标:
对SparkSQL2.x模块中DataFrame的API操作进行整理。在工作中多个业务场景应用SparkSQL模块完成离线批处理操作,对海量历史数据处理和分析,分析结果数据,供下一步数据应用进行使用。并且在性能上解决了Hive方面的性能短板问题。在此记录下对SparkSQL模块中DataFrame的API常用操作。
学习内容:
1、 掌握DataFrame中常用api操作,包含:①数据源读取与保存。②在DataFrame中ETL操作。
2、流程:①应用spark对象完成声明操作
ps:目的在于对自身的掌握情况完成记录和后期的技术温顾,希望对大家都有帮助
package LogsAnalyse
import org.apache.spark.sql.SparkSession
object DataFrameCase {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DataFrame").master("local[2]").getOrCreate()
val rdd = spark.sparkContext.textFile("C:\\Users\\BaiLing\\Desktop\\small.txt")
//隐式转换
import spark.implicits._
val infoDF = rdd.map(_.split("\\|")).map(line=>Student(line(0).toInt,line(1),line(2),line(3))).toDF()
infoDF.show(30,false)
infoDF.select("email","name").show(false)
// ②infoDF.select(infoDF.col("name"),infoDF.col("email")).show(false)
// ③infoDF.select(infoDF("name"),infoDF("email")).show(false)
//①应用filter函数完成对数据过滤操作,
infoDF.filter("name='' or name=='NULL'").show(30,false)
//②应用filter函数完成对name以M开头的并且name不为空数据的过滤操作,所呈现结果为满足函数内容的数据
//name以M开头的并且name不为空的有效数据并且按照指定字段进行排序
infoDF.filter("SubString(name,0,1)!='M' and name!='' and name!='NULL'").sort("name")
infoDF.select(infoDF("name").as("student_name")).show(30,false)
infoDF.select(infoDF.col("name").as("stu_name")).show(false)
//完成对name字段M开头数据的过滤,并且name过滤数据为空的值,并且对指定字段完成排序工作
infoDF.filter("SubString(name,0,1)!='M' and name!='' and name!='NULL'").sort(infoDF.col("name").desc,infoDF.col("id")).show(30,false)
val infoDF_two = rdd.map(_.split("\\|")).map(line=>Student(line(0).toInt,line(1),line(2),line(3))).toDF()
//完成数据之间的join操作
infoDF.join(infoDF_two,infoDF.col("id")===infoDF_two.col("id")).show(false)
spark.close()
}
case class Student(id:Int,name:String,phone:String,email:String)
}
相应语句在在应用到spark-shell或者提交到集群都有相应的产出。