day70:Spark SQL内置函数解密与实战

来源:互联网 发布:公务员考试成绩算法 编辑:程序博客网 时间:2024/05/22 06:13

Spark on hive:

将hive的元数据当作一个数据源

Hive on spark:(未来一个趋势)

Hive 本来的计算框架是mr,换成spark 来计算

目前企业及大数据spark开发的时候绝大多数情况下采用hive 作为数据仓库的;spark提供了Hive的支持功能,spark通过hiveContext 可以直接操作hive 的数据;

基于HiveContextk可以使用sql/hql两种方式编写sql来对hive进行操作,包括表增删改查,往表里导入数据以及用sql语法

实现sparkSQL 查询

package cn.db.scala.sparksql.day70import org.apache.spark.sql.Rowimport org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.types.{StringType, StructField, StructType}import org.apache.spark.{SparkContext, SparkConf}import org.apache.spark.sql.functions._/** * Created by ptbx on 2016/5/30. *//** * Created with IntelliJ IDEA. * User: ptbx * Date: 2016/5/30 * Time: 23:35 * To change this template use File | Settings | File Templates.  spark 1.5 以后提供了大量的内置函数:   def agg(aggExpr: (String, String), aggExprs: (String, String)*): DataFrame = {    groupBy().agg(aggExpr, aggExprs : _*) 还有max,mean、min sum、avg、explode、size、sort、array、day、 to_date、abs、acros 1、聚合函数 例如 countDistinct 去重级别  sumDistinct 2、集合函数 例如: sort_array explode 等 3、日期、时间函数 :  } */object SparkSQLAvg {  def main (args: Array[String]) {   val conf = new SparkConf()   conf.setAppName("sparksql").setMaster("local")   val sc = new SparkContext(conf)   val sqlContext = new HiveContext(sc)   //要使用spark SQL 的内置函数就一定要导入的SQLContext 的隐式转换   import sqlContext.implicits._   var userDatas = Array(   "2016-06-01, 001,http://spark.apache.org/",   "2016-06-02, 002,http://hadoop.apache.org/",   "2016-06-08, 003,http://flume.apache.org/",   "2016-06-06, 004,http://kafka.apache.org/",   "2016-06-07, 005,http://hive.apache.org/",   "2016-06-10, 006,http://hbase.apache.org/",   "2016-06-11, 007,http://parquet.apache.org/"   )   val userDataRDD = sc.parallelize(userDatas)   /**    * 4、根据业务需要将对数据进行预处理生成DAtaFrame,要想把RDD转成DataFrame,需要把RDD中的元素类型变成Row类型    * 同时要提供DataFrame中的Columns的元数据信息描述    */  val userRDDRow =  userDataRDD.map( row => {val splited = row.split(","); Row(splited(0), splited(1), splited(2))})   val structType = StructType(Array(      StructField("time",StringType, true),      StructField("id",StringType, true),      StructField("url",StringType, true)   ))  val userDataDF =sqlContext.createDataFrame(userRDDRow, structType)   /**    * 5、根据sparkSql提供的内置函数对DataFrame进行操作,    */   userDataDF.groupBy("time").agg('time,countDistinct('id)).show  }}


0 0
原创粉丝点击