import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.SQLContext import org.apache.spark.sql.functions._ /** */ object sparkDataframe { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").setAppName("anti_Join") val sqlcontext = new SQLContext(new SparkContext(conf)) import sqlcontext.implicits._ val scoreDF = Seq((1, "sk", 99), (2, "jim", 72), (1, "sk", 99)).toDF("id", "name", "score") val stuDF = Seq((1, "sk", 99), (2, "jim", 72), (3, "jiem", 82)).toDF("id", "name", "score") /* * UDF的两种模式 * * 1.sqlcontext注册udf,包含两个变量,静态 * * 2.便动态的UDF * * */ sqlcontext.udf.register("nameScore", (name: String, score: String) => { name match { case name: String if name.startsWith("s") => "China" case _ => "USA" } }) val nameScores = udf((name: String, score: String) => { name match { case name: String if name.startsWith("s") => "China" case _ => "USA" } }) scoreDF.selectExpr("nameScore(name,score) as Country").show() scoreDF.select(nameScores($"name",$"score").as("Cout")).show() } }
- Spark SQL 程序开发过程中,我们有两种方式确定 schema,第一种是反射推断 schema,如本文的案例二,这种方式下,我们需要定义样本类 (case class) 来对应数据的列;第二种方式是通过编程方式来确定 schema,这种方式主要是通过 Spark SQL 提供的 StructType 和 StructField 等 API 来编程实现,这种方式下我们不需要定义样本类,如本文中的案例一。
在程序实现中,我们需要使用
以便隐式的把 RDD 转化成 DataFrame 来操作(Scala 隐式转换)。
- 通常来说,我们有两种方式了解 Spark 程序的执行流程。第一种是通过在控制台观察输出日志,另一种则更直观,就是通过 Spark Web Console 来观察 Driver 程序里各个部分产生的 job 信息以及 job 里包含的 stages 信息。
- 需要指出的是,熟练的掌握 Spark SQL/DataFrame 的知识对学习最新的 Spark 机器学习库 ML Pipeline 至关重要,因为 ML Pipeline 使用 DataFrame 作为数据集来支持多种的数据类型。