SparkSQL JOIN 相关的自己看的笔记;

背景:昨天[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;
大数据处理的数据是分散在各地server上的表所以 join表是无法避免的,这一点和traditional db 还是有区别的;

-------具体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)

   }

}

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值