您的位置:首页 > 数据库

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

2016-01-28 07:51 330 查看
背景:昨天[2016/1/27],TL说sparkSQL处理 join的时候不够完美;

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

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

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

隐式:

大数据处理的数据是分散在各地server上的表所以 join表是无法避免的,这一点和traditional db 还是有区别的;

下班前,更新:

到目前,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)
}
}
------------------------内容很杂,等到知识足够丰富,整合到一起,总结------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: