背景:昨天[2016/1/27],TL说sparkSQL处理 join的时候不够完美;

于是昨天开始在各类大数据相关网站查 join的方法,并且把Github上的源码下载后,开始阅读,

今天(1/28),记录一些学到的东西,加深记忆;

首先,join的使用 有两种,我叫他 显式和隐式;

隐式:


SELECT 
 Persons.LastName, Persons.FirstName, Orders.OrderNo 

 
 
 FROM 
 Persons, Orders 

 
 
 WHERE 
 Persons.Id_P = Orders.Id_P; 

 

  显式: 

 
 
  SELECT 
  Persons.LastName, Persons.FirstName, Orders.OrderNo 
 
 
 
 
  FROM 
  Persons 
 
 
 
 
  INNER 
  JOIN 
  Orders 
 
 
 
 
  ON 
  Persons.Id_P = Orders.Id_P 
 
 
 
 
  ORDER 
  BY 
  Persons.LastName; 
 
 
 
 
 

  -------具体Github上的源码分析,我会在周末更新---------------------------- 

 
 
 
 
下班前,更新:
到目前,Github 最新版的spark stable version是1.6.0;
首先是 spark-shell 展示给我们的页面:src location:org.apache.spark.rep-》SparkILoop.scala
代码很清晰,应该不用解释;
Join的type(在sql目录下的catalyst /plan下) 现在已经细分 可分为:INNER, LEFTOUTER, RIGHTOUTER,FULLOUTER,LEFT SEMI;
join-type 的选取是根据模式匹配,匹配字符串,具体规则为
@requires_authorization
 
case "inner"=>Inner
 
 
 
case "outer" |"full" | "fullouter"=>FullOuter
 
 
case "leftouter" | "left"=>LeftOuter
 
 
case "rightouter" | "right"=>RightOuter
 
  
case "leftsemi"=>LeftSemi
 
  

 
  
 如果无法匹配上述规则会抛出 IllegAlargumentException 
---------------------今天到此,每天时间不多,-----------------------------------------
 先分析下源码中sql module 的结构;sql module 分为 catalyst,core,hive 和hive-thrift server;
catalyst 功能为 一个用于agnostic 的框架,可以管理 关系符河语句;
core 功能:去 翻译 catalyst 的query语句 并执行;query 语句的 execute engine,将逻辑的sql语句转换为RDD ;
hive: 主要的function 类为 hive-context the extention of sql-context;主要功能是实现hive QL ;
hive-thriftserver: it's the support of the HiveQL; 
-------------------第一个 API 诞生------------------------------------------------
第一步,安装spark,具体过程official为准,因为spark安装一直在小改,改到越来越好装;
第二步,写API,建议用scala,java毕竟太啰嗦,仅个人观点,文件结构如下;
Admins-MacBook-Pro-88:test **8$ find .
.
./**.sbt
./src
./src/main
./src/main/scala
./src/main/scala/***.scala
利用 sbt 打包;
最后,就可用spark-submit 运行 测试了, 整个过程很简单,但是初次接触弄了一天;
当submit时,如果在机器上撞了Hadoop,编写API时,文件路径必须加file://,如果默认的话会以hdfs匹配;
而且,submit检索的起始目录为用户的根目录,而不是当前所在目录或者是spark根目录;

-----------------第一个 SparkSQL application 诞生--------------------------------------------
SQL支持的文件很多有 txt,jason parquet 等等;
代码在下面贴出,主要遇到的问题有
1. scala version 问题,配置sbt配置文件时scala的version 为配置spark时的scala 版本而不是本机自己安装的scala 版本;
忘记scala version 可以type spark-shell on cmd
terminal 启动spark的过程会有 spark 标志出现,紧接着就回发现scala版本;
2. case 类 要写到主类外面,写在main里面会出现 无法识别 .doDF方法的 exception;

            /********SparkSQL TEST APP***********/

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

case class Person(name:String, age:Int)

object teenagers{
  def main(args: Array[String]){
    val conf = new SparkConf().setAppName("SQL Application")
    val sc = new SparkContext(conf)
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)

    import sqlContext.implicits._

    val people = sc.textFile("file:///Users/xjin/Downloads/spark-1.6.0-bin-hadoop2.6/examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0),p(1).trim.toInt)).toDF()
    people.registerTempTable("people")

    val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")

    teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
   }
}

------------------------内容很杂,等到知识足够丰富,整合到一起,总结------------------------------