sparkSQL的sqlContext和hHiveContext的汇总(二)

sqlContext总的一个过程如下:
1.SQL语句经过SqlParse解析成UnresolvedLogicalPlan;
2.使用analyzer结合数据数据字典(catalog)进行绑定,生成resolvedLogicalPlan;
3.使用optimizer对resolvedLogicalPlan进行优化,生成optimizedLogicalPlan;
4.使用SparkPlan将LogicalPlan转换成PhysicalPlan;
5.使用prepareForExecution()将PhysicalPlan转换成可执行物理计划;
6.使用execute()执行可执行物理计划;
7.生成SchemaRDD。
在整个运行过程中涉及到多个SparkSQL的组件,如SqlParse、analyzer、optimizer、SparkPlan等等
eg:
import org.apache.spark.sql._
val sparkConf = new SparkConf().setAppName("new_proj")
implicit val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val projects = sqlContext.read.json("/part-m-00000.json")

hiveContext总的一个过程如下
1.SQL语句经过HiveQl.parseSql解析成Unresolved LogicalPlan,在这个解析过程中对hiveql语句使用getAst()获取AST树,然后再进行解析;
2.使用analyzer结合数据hive源数据Metastore(新的catalog)进行绑定,生成resolved LogicalPlan;
3.使用optimizer对resolved LogicalPlan进行优化,生成optimized LogicalPlan,优化前使用了ExtractPythonUdfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)))进行预处理;
4.使用hivePlanner将LogicalPlan转换成PhysicalPlan;
5.使用prepareForExecution()将PhysicalPlan转换成可执行物理计划;
6.使用execute()执行可执行物理计划;
7.执行后,使用map(_.copy)将结果导入SchemaRDD。
eg:
Object hiveContextDemo{
 def main(args:Array[String]):Unit={
 if(args.length==0){
 println("Args:<runLocal><kuduMaster>"+"<kuduAccountMartTableName>")
return
}
val runLocal =args(0).equalsIgnoreCase("1")
val kuduMaster=args(1)
val kuduAccountMartTableName=args(2)
val sc:SparkContext=if(runLocal){
val sparkConfig=new SparkConf()
sparkConfig.set("spark.broadcast.compress","false")
sparkConfig.set("spark.shuffle.compress","false")
sparkConfig.set("spark.shuffle.spill.compress","false")
new SparkContext("local","TableStatsSinglePathMain",sparkConfig)
}else{
val sparkconfig=new SparkConf().setAppName("TableStatsSinglePathMain")
new SparkContext(sparkConfig)
}
val hiveContext=new HiveContext(sc);
val kuduOptions=Map(
"kudu.table"->kuduAccountMasterTableName,
"kudu.master"->kuduMaster)
hiveContext.read.options(kuduOptions).format("org.kududb.spark.kudu").load.registerTempTable("account_mart_tmp")
println("---------------")
val values=hiveContext.sql("select account_id,sum(win_count) from account_mart_tmp group by account_id").take(100)
println("--------")
values.foreach(println)
println("--------")
sc.stop
}
}
}
eg2:
Object Example{
def splitArry(args:Array[String]){
args.map((arg:String)=>println("one arg is:"+arg+"!"))
}
def main(args:Array[String]){
implicit val sc=new SparkContext(new SparkConf().setAppName("Exaple").setMaster("yarn-client"))
implicit val hc=new HiveContext(sc)
val df=hc.parquetFile("/apps/risk/det/madmen20/bre/sorce=live")
df.printSchema()
df.take(1).foreach(println)
splitArray(args)
}
}
备注:下面HiveContext的实例来源git上面的demo,便于进一步理解HiveContext。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值