spark从入门到放弃二十八:Spark Sql (1)Data Set

文章地址:http://www.haha174.top/article/details/257834
项目源码:https://github.com/haha174/spark.git
1.简介


Spark Sql 是Spark 中的一个模块,主要是用于进行结构化数据处理。它提供的最核心的编程抽象,就是DataFrame。同时Spark Sql 还可以作为分布式sql 查询引擎。Saprk Sql 最重要的功能之一,就是从hive 中查询数据。

Data Frame 可以理解为 以列的形式组织的,分布式的数据集合。它其实和关系型数据库中的表非常类似,但是底层做了许多的优化。DataFrame可以通过很对源进行构建,包括结构化数据文件,hive中的表,外部的关系型数据库以及RDD.

Dataset是从Spark 1.6开始引入的一个新的抽象,当时还是处于alpha版本;然而在Spark 2.0,它已经变成了稳定版了.DataFrame是特殊的Dataset,它在编译时不会对模式进行检测

2.SQLContext

首先要使用spark sql 首先就得创建一个SQLContext 对象,或者是他的子类对象或者是HiveContext 的对象。
2.1 创建DataSet(这里没有使用SparkSession 的方式)
使用SQLContext,可以从RDD,hive 表或者其他的数据源,来创建一个DataSet,以下是JSON文件创建DataSet的例子:
SQLContext sqlContext=new SQLContext(sc);
DataSet df=sqlContext.read().json("hdfs://spark1:9000/students.json");
df.show()
下面给出一个java 示例:

public class DataFrameStudy {

    public static void main(String[] args) {
        SparkConf conf=new SparkConf().setAppName("DataFrameStudy");
        JavaSparkContext sc=new JavaSparkContext(conf);
        SQLContext sqlContext=new SQLContext(sc);
        DataFrameReader reader=sqlContext.read();
        Dataset ds= reader.json("hdfs://hadoop:8020/data/students.json");
        ds.show();
    }

}

students.json 长这个样子

{"id":1,"name":"java","age":18}
{"id":2,"name":"spark","age":19}
{"id":3,"name":"scala","age":20}

将打成的jar提交到spark 集群上面去运行下面给出submit 脚本

/apps/soft/spark-2.2.1-bin-hadoop2.7/bin/spark-submit \
 --class com.wen.saprk.sql.core.DataFrameStudy  \
--num-executors 3  \
--driver-memory 1g   \
 --executor-memory 1g  \  
--executor-cores 1  \
 --master spark://192.168.1.22:7077 /data/spark-submit/spl/dataframe/spark-study-sql-java-1.0-SNAPSHOT-jar-with-dependencies.jar

赋予执行权限

chmod  777 submit-sql.sh

执行即可看到


这里写图片描述

下面给出scala 示例

object DataFrameStudy {
  def main(args: Array[String]): Unit = {
      val conf=new SparkConf().setAppName("DataFrameStudy")
      val  sc = new SparkContext(conf)
      val sqlContext = new SQLContext(sc)
     val reader = sqlContext.read
      val ds = reader.json("hdfs://hadoop:8020/data/students.json")
      ds.show()
  }
}

结果和脚本和上面一样就不再演示了
3.HiveContext


除了基本的SQLContext 以外,还可以使用它的子类--HiveContext.HiveContext的功能除了包含SqlContext 提供的所有功能之外,还包含了额外的专门针对于Hive的一些功能。这些额外的功能包括:使用HiveQL 语法来编写和执行SQL,使用Hive中的UDF函数,从Hive表中读取数据。
要使用HiveContext,就必须预先安装好Hive,SQLContext支持的数据源,HiveContext也同样支持。对于Spark 1.3.x 以上的版本都推荐使用HiveContext,因为他的功能更加的丰富和完善。
Spark Sql 还支持用spark.sql.dialect 参数设置Sql的方言,使用SqlContext的setConf()既可以进行设置。对于SqlContext ,它支持sql 一种方言。对于HiveContext 默认的方言是hiveql.

4.Data Set 常用操作

下面给出java 示例:

public class DataFrameOperation {
    public static void main(String[] args) {
        SparkConf conf=new SparkConf().setAppName("DataFrameOperation");
        JavaSparkContext sc=new JavaSparkContext(conf);
        SQLContext sqlContext=new SQLContext(sc);
        DataFrameReader reader=sqlContext.read();
        //创建出dataset  可以理解为一张表
        Dataset ds= reader.json("hdfs://hadoop:8020/data/students.json");
        //打印dataFrame中的所有数据
        ds.show();
        ////打印dataFrame的元数据
        ds.printSchema();
        //查询某列所有的数据
        ds.select("name").show();
        //查询某几列所有的数据并对列进行计算
        ds.select(ds.col("name"),ds.col("age").plus(1)).show();
        //根据某一列的值进行过滤
        ds.filter(ds.col("age").gt("18")).show();
        //根据某一列进行分组聚合
        ds.groupBy(ds.col("age")).count().show();
        sc.close();
    }
}

提交脚本运行即可

/apps/soft/spark-2.2.1-bin-hadoop2.7/bin/spark-submit  --class com.wen.spark.sql.core.DataFrameOperation  --num-executors 1  --driver-memory 1g   --executor-memory 1g  --executor-cores 1   --master spark://192.168.1.22:7077 /data/spark-submit/spl/dataframe/java/spark-study-sql-java-1.0-SNAPSHOT-jar-with-dependencies.jar

下面给出scala 示例


  object DataFrameOperation {
    def main(args: Array[String]): Unit = {
      val conf = new SparkConf().setAppName("DataFrameOperation")
      val sc = new JavaSparkContext(conf)
      val sqlContext = new SQLContext(sc)
      val reader = sqlContext.read
      //创建出dataset  可以理解为一张表
      val ds = reader.json("hdfs://hadoop:8020/data/students.json")
      //打印dataFrame中的所有数据
      ds.show()
      ////打印dataFrame的元数据
      ds.printSchema()
      //查询某列所有的数据
      ds.select("name").show()
      //查询某几列所有的数据并对列进行计算
      ds.select(ds.col("name"), ds.col("age").plus(1)).show()
      //根据某一列的值进行过滤
      ds.filter(ds.col("age").gt("18")).show()
      //根据某一列进行分组聚合
      ds.groupBy(ds.col("age")).count.show()
      sc.close()
    }
}

欢迎关注,更多福利

这里写图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容