关于SparkSQL那些事(二)----sparksql基础语法(下)

本文详细介绍如何使用 Spark SQL 对 DataFrame 进行操作,包括创建临时表和永久表、各种查询方式如排序、分组、连接查询等,以及如何执行运算、分页查询和使用 Scala 实现 Spark SQL 操作。

       在上一篇博客中,重点介绍了如何通过sparksql来执行查询操作,虽然可以实现对创建的DateFrame进行操作,但是语法和普通的关系型数据库的SQL操作存在差异。不容易记住,所以这一篇博客中,介绍如何通过普通SQL来操作。

     通过SQL语句来调用

           创建表

                      df.registerTempTable("tabName");---->创建的是临时表

                      df.saveAsTable("tabName");---------->创建的是永久表

                      永久表和持久表的区别就在于:临时表在会话结束时,会被删除;而持久表会在会话结束后被保存下来。

           查询操作

                       我们首先创建一个DateFrame,进行演示。

                       >import org.apache.spark.sql.SQLContext

                       >val ssc=new SQLContext(sc);

                       >val df=sc.makeRDD(List((1,"a","bj"),(2,"b","sh"),(3,"c","gz"),(4,"d","bj"),(5,"e","gz"))).toDF("id","name","addr");

                       >df.registerTempTable("stu");----->注册临时表

                1)查询

                      

                2)带条件查询

                     

                3)排序查询

                    

                      注意:这里和SQL类似,默认的情况下是升序排序。

                4)分组查询

                      

                5)连接查询

                         这里我们创建新的DataFrame来进行操作。

                         >import org.apache.spark.sql.SQLContext

                         >val ssc=new SQLContext(sc);

                         >val dept=sc.parallelize(List((100,"财务部"),(200,"研发部"))).toDF("deptid","deptname")

                         >val emp=sc.parallelize(List((1,100,"张财务"),(2,100,"李会计"),(3,300,"王艳发"))).toDF("id","did","name")

                         >dept.registerTempTable("deptTab");

                          >emp.registerTempTable("empTab");

                          >sc.sql("select deptname,name from deptTab inner join empTab on deptTab.deptid=empTab.did").show()

                         

                        这里演示的是内连接,左外连接和右外连接可自行调试。

                6)执行运算

                         >import org.apache.spark.sql.SQLContext

                         >val ssc=new SQLContext(sc);

                         >val df = sc.makeRDD(List(1,2,3,4,5)).toDF("num");

                         >df.registerTempTable("tabx")

                         >ssc.sql("select num*10 from tabx").show()

                  7)分页查询 

                                  >import org.apache.spark.sql.SQLContext

                                 >val ssc=new SQLContext(sc);

                                 >val df = sc.makeRDD(List(1,2,3,4,5)).toDF("num");

                                 >df.registerTempTable("tabx")

                                 >ssc.sql("select * from tabx limit 3").show();

                  8)查看表

                               >ssc.sql("show tables").show

                  9)  类似hive方式的操作

                               >val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)

                               >hiveContext.sql("create table if not exists zzz (key int, value string) row format delimited fields terminated by '|'")
                               >hiveContext.sql("load data local inpath 'file:///home/software/hdata.txt' into table zzz")

                               >hiveContext.sql("select key,value from zzz").show

                   10)Scala实现sparkSql操作

                                    val conf=new SparkConf().setMaster("spark://IP地址:7077").setAppName("操作名称");

                                    val sc=new SparkContext(conf);

                                     val sqlContext=new SQLContext(sc)

                                     val rdd=sc.makeRDD(List((1,"zhang"),(2,"li"),(3,"wang")))

                                    import sqlContext.implicits._

                                    val df=rdd.toDF("id","name")

                                    df.registerTempTable("tabx")

                                    val df2=sqlContext.sql("select * from tabx order by name");

                                    val rdd2=df2.toJavaRDD;---->schemaRDD转换成JavaRDD

                                   rdd2.saveAsTextFile("file:///home/software/result")----->将结果输出到linux的本地目录

                                   

### 回答1: Spark SQL是Spark生态系统中的一个组件,它提供了一种用于结构化数据处理的高级数据处理接口。Spark SQL支持使用SQL语言进行数据查询和处理,并且可以与Spark的其他组件(如Spark Streaming、MLlib等)无缝集成。Spark SQL还支持使用DataFrame API进行数据处理,这使得开发人员可以使用Scala、Java、Python和R等编程语言进行数据处理。Spark SQL还支持将数据存储在各种数据源中,如Hive、JSON、Parquet等。Spark SQL的主要优点是可以处理大规模的结构化数据,并且具有高性能和可扩展性。 ### 回答2: SparkSQL是Apache Spark中的一种组件,它用于处理结构化和半结构化数据。与传统的Spark核心功能相比,SparkSQL提供了更高级的数据处理工具,使得用户可以使用SQL查询和操作结构化数据。 SparkSQL的基本概念包括DataFrame和Dataset。DataFrame是强类型的分布式数据集,它可以看作是一个表,每一列都有一个名字和数据类型。Dataset是比DataFrame更加丰富的API,它可以以编程的方式进行查询和操作数据。 SparkSQL支持使用标准的SQL查询语言进行数据查询和聚合。用户可以编写SQL语句来过滤、聚合和排序数据,并通过SparkSQL将结果存储在DataFrame或Dataset中。 SparkSQL还支持多种数据格式的读取和写入,包括Parquet、Avro、JSON和CSV等。用户可以通过提供Schema来从这些格式中读取数据,并可以选择将数据以这些格式写入磁盘。 另外,SparkSQL还提供了与Hive的集成,使得用户可以使用Hive的元数据和UDF函数。用户可以通过SparkSQL查询Hive表,并将查询结果存储在Hive表中。 SparkSQL还支持缓存数据以提高查询性能。用户可以使用DataFrame或Dataset的persist()方法将数据持久化到内存或磁盘中,并可以通过调用unpersist()方法来释放缓存的数据。 总结来说,SparkSQL是Apache Spark中用于处理结构化和半结构化数据的组件,它提供了DataFrame和Dataset的概念,支持使用SQL语言进行数据查询和聚合,以及多种数据格式的读写,还具备与Hive的集成以及数据缓存等功能。 ### 回答3: Spark SQL是Apache Spark的一个模块,它提供了用于处理结构化数据的SQL查询和集成,使得在Spark中可以方便地进行数据处理和分析。 Spark SQL的核心是DataFrames,它是一种可处理具有命名列的分布式数据集的数据结构。DataFrames可以由多种数据源创建,包括结构化数据、Parquet文件、JSON文件、Hive表等。与传统的RDD相比,DataFrames具有更高的性能和更强的优化能力,因为它们提供了类似于传统数据库的结构化查询API。 通过Spark SQL,我们可以使用标准的SQL查询语言来查询和操作DataFrames中的数据。Spark SQL支持常见的SQL操作,如SELECT、JOIN、GROUP BY等,还支持用户自定义函数和聚合函数的定义。这使得开发人员可以使用熟悉的SQL语法来处理和分析数据,无需编写复杂的MapReduce或Spark程序。 除了SQL查询,Spark SQL还提供了用于将DataFrames转换为RDD的接口,以及将RDD转换为DataFrames的接口。这使得在需要深度定制数据处理逻辑时可以灵活地切换和使用两者之间的API。 总之,Spark SQL是一个强大而灵活的数据处理工具,它通过提供SQL查询和集成的方式,使得在Spark中可以方便地处理和分析结构化数据。它不仅提供了与传统数据库类似的性能和优化能力,还提供了与Spark的其他组件(如MLlib和GraphX)的无缝集成,使得在Spark平台上进行大规模数据处理变得更加简单和高效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VogtZhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值