spark-sql入门(一)通过spark-shell命令行操作

  SparkSQL是spark用来处理结构化的一个模块,它提供一个抽象的数据集DataFrame,并且是作为分布式SQL查询引擎的应用

   注:本文所有操作是基于ambari工具,搭建好了 hdfs yarn hive spark mapReduce 等大数据常用的组件

一、进入spark命令窗口

    输入命令   spark-shell 

  以上是各种报错的部分截图,原因是spark操文件时,用的是hdfs系统,使用hdfs系统必须hdfs账号来操作,

  为了解决上述问题,切换用户到hdfs用户即可

退出重新进入

 切换hdfs用户

 su hdfs

重新进入spark-shell

spark-shell

现在完全正常了,

二、创建DataFrames

     2.1、创建了一个数据集,实现了并行化

      val seq= Seq(("1","xiaoming",15),("2","xiaohong",20),("3","xiaobi",10))

      var rdd1 = sc.parallelize(seq)

 

 2.2、将当前的rdd对象转换为DataFrame对象(数据信息和数据结构信息存储到DataFrame)

val df = rdd1.toDF("id","name","age")

   

三、查询数据操作

 3.1、DSL 风格语法

df.select("name").show
df.select("name","age").show
//条件过滤
df.select("name","age").filter("age >10").show
//参数必须是一个字符串,filter中的表达式也需要时一个字符串

    3.1.1、参数是类名col (“列名”)

    df.select(“name”,“age”).filter(col(“age”) >10).show

    3.1.2、分组统计个数

    df.groupBy("age").count().show()

   3.1.3、打印DataFrame结构信息

    df.printSchema

   3.2、SQL风格语法

   DataFrame的一个强大之处就是我们可以将它看作是一个关系型数据表,然后可以通过在程序中使用spark.sql() 来执行SQL查询,结果将作为一个DataFrame返回。

如果想使用SQL风格的语法,需要将DataFrame注册成表,注册方式如下

     df.registerTempTable("t_person")

       表示 将DataFrame成t_person表

        3.2.1 、查询年龄最大的前两名

              spark.sql("select * from t_person order by age desc limit 2").show

   3.2.2、显示表的Schema信息

       spark.sql("desc t_person").show

3.2.3 、查询年龄大于30的人的信息

 spark.sql("select * from t_person where age > 10 ").show

3.3、DataSet 风格

    3.3.1. 、 什么是DataSet

    DataSet是分布式的数据集合。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用函数式的转换(map/flatmap/filter)进行多种操作

  3.3.2  、 DataFrame、DataSet、RDD的区别

    同样一组数据,分别形式如下

        RDD中的长像:

    DataFrame中的长像

Dataset中的长像

DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。

(1)DataSet可以在编译时检查类型

(2)并且是面向对象的编程接口

相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。

   3.3.3  DataFrame与DataSet的互转

DataFrame和DataSet可以相互转化。

(1)DataFrame转为 DataSet

df.as[ElementType]这样可以把DataFrame转化为DataSet。

(2)DataSet转为DataFrame 

ds.toDF()这样可以把DataSet转化为DataFrame。


  3.3.4.  创建DataSet

    3.3.4.1 、通过spark.createDataset创建

     val ds = spark.createDataset(1 to 10)

    

  3.3.4.2、通toDS方法生成DataSet

    定义一个类

     case class Person(name:String,age:Long)

     定义一个类的集合

     val data = List(Person("zhangsan",20),Person("lisi",30))

   转成DS

    val ds = data.toDS

  

 查看DS

   ds.show 

  

猜你喜欢

转载自blog.csdn.net/yb546822612/article/details/105558512