spark-shell是一个scala编程解释执行环境,可以通过编程的方式处理逻辑复杂的计算,但对于简单的类似sql的数据处理,比如分组求和,sql为”select g,count(1) from sometable group by g”,需要写的程序是:
val hive = neworg.apache.spark.sql.hive.HiveContext(sc)
import hive._
val rdd = hql(“selectg,count(1) from sometable group by g”)
rdd.collect
看起来繁琐,对于只注重业务数据的人来说,附加了过多的spark工具的内容。
用spark-shell的-i参数设定启动脚本,可以省去hive变量定义和import两句。
用面向对象编程把后两句可以合并变为hql(“select g,count(1) from sometable group by g”).collect。
用scala隐形转换再简单为“selectg,count(1) from sometable group by g”.hqlgo。
用scala省略括号特性,可以写成“selectg,count(1) from sometable group by g” hqlgo。
简化后的语句:“select g,count(1) from sometable group by g” hqlgo
如果分多行写可以写成:
“””
selectg,count(1)
from sometable
group by g
“”” hqlgo
查询结果保存需要写的程序:
val rdd = hql(“selectg,count(1) from sometable group by g”)
rdd.saveAsTextFile(“hdfs:/somedir”)
同上面的sql提交类似,简化后的语句:“select g,count(1) from sometable group by g” saveto “hdfs:/somedir”
多行形式:
“””
selectg,count(1)
from sometable
group by g”””saveto “hdfs:/somedir”
注:
1)多行写时saveto与前面不能再分行,后面的路径也不能再分行
2)如果保存到本地文件,文件应包含扩展名后缀
3)原spark实现的输出格式有问题,hive不能正确解析数据结构,新改的定制版已解决
对hdfs中的数据进行sql,如果想在hive中创建表则用”create externaltable ...” hqlgo即可;如果只创建内存表做数据处理,需要写的程序:
val rdd =sc.textFile(“hdfs:/somedir”)
case class SomeClass(name:String,age:Int,weight:Double)
val schemardd = rdd.map(_.split("\t")).map(t=>SomeClass (t(0),t(1),t(2)))
hive.registerRDDAsTable(schemardd,"sometable")
hql(“selectg,count(1) from sometable group by g”).collect
简化后的语句:
"create table sometable (name string,age int,weightdouble)" from "hdfs:/somedir"
“selectg,count(1) from sometable group by g” hqlgo
多行形式:
“””
create tablesometable (
name string,
age int,
weight double)
“”” from"hdfs:/somedir"
“selectg,count(1) from sometable group by g” hqlgo
注:
1)”create table ”需严格按此写,create后、table后必须有一个空格
2)输出路径为了避免覆盖大的目录,全路径字符长度必须大于等于24个字符
计算结果可能是数据表、也可能输出到文件。
数据表检查:”sometable” isok
文件检查:”somefile.txt” isok
“hdfs:/somedir” isok
判断的标准是文件不为空,长度大小大于0;路径不为空,下面存在长度大于的文件;数据表记录条数大于0。
注:
1)文件应包含扩展名后缀,在输入的字符串中如果包含“.”、“/”则认为是文件或目录,不包含认为是数据表
2)如果想把查询结果保存到内存用val data = "select * from testperson" hqlresult,查看内存中查询的结果用do show data
/sysdir/spark-1.0.0/bin/myspark
输入help可以得到帮助。
原文:http://blog.csdn.net/hyalone2010/article/details/37649329