spark sql

Spark SQL简介
Spark为结构化数据处理引入了一个称为Spark SQL的编程模块。它提供了一个称为DataFrame的编程抽象,并且可以充当分布式SQL查询引擎。

Spark SQL的特性

集成

无缝地将SQL查询与Spark程序混合。 Spark SQL允许您将结构化数据作为Spark中的分布式数据集(RDD)进行查询,在Python,Scala和Java中集成了API。这种紧密的集成使得可以轻松地运行SQL查询以及复杂的分析算法。

统一数据访问

加载和查询来自各种来源的数据。 Schema-RDDs提供了一个有效处理结构化数据的单一接口,包括Apache Hive表,镶木地板文件和JSON文件。

Hive兼容性

在现有仓库上运行未修改的Hive查询。 Spark SQL重用了Hive前端和MetaStore,为您提供与现有Hive数据,查询和UDF的完全兼容性。只需将其与Hive一起安装即可。

标准连接

通过JDBC或ODBC连接。 Spark SQL包括具有行业标准JDBC和ODBC连接的服务器模式。

可扩展性

对于交互式查询和长查询使用相同的引擎。 Spark SQL利用RDD模型来支持中查询容错,使其能够扩展到大型作业。不要担心为历史数据使用不同的引擎。

Spark SQL架构

此架构包含三个层,即Language API,Schema RDD和数据源。

语言API

Spark与不同的语言和Spark SQL兼容。 它也是由这些语言支持的API(python,scala,java,HiveQL)。

模式RDD

Spark Core是使用称为RDD的特殊数据结构设计的。 通常,Spark SQL适用于模式,表和记录。 因此,我们可以使用Schema RDD作为临时表。 我们可以将此Schema RDD称为数据帧。

数据源

通常spark-core的数据源是文本文件,Avro文件等。但是,Spark SQL的数据源不同。 这些是Parquet文件,JSON文档,HIVE表和Cassandra数据库。

4 sparkSQL 数据帧

DataFrame是一个分布式数据集合,它被组织成命名列。从概念上讲,它相当于具有良好优化技术的关系表。

DataFrame可以从不同来源的数组构造,例如Hive表,结构化数据文件,外部数据库或现有RDD。这个API是为现代大数据和数据科学应用程序设计的,从Python的R ProgrammingandPandas中的DataFrame中获得灵感。

DataFrame的特性

能够将单个节点集群上的大小为Kilobytes到Petabytes的数据处理为大型集群。

支持不同的数据格式(Avro,csv,弹性搜索和Cassandra)和存储系统(HDFS,HIVE表,mysql等)。

通过Spark SQL Catalyst优化器(树变换框架)的最先进的优化和代码生成。

可以通过Spark-Core轻松地与所有大数据工具和框架集成。

提供用于Python,Java,Scala和R编程的API。

6 简单shell

6.1.在本地创建一个文件,有三列,分别是id、name、age,用空格分隔,然后上传到hdfs上
hdfs dfs -put person.txt /

6.2.在spark shell执行下面命令,读取数据,将每一行的数据使用列分隔符分割
val lineRDD = sc.textFile("hdfs://master:9000/person.txt").map(_.split(" "))

6.3.定义case class(相当于表的schema)
case class Person(id:Int, name:String, age:Int)

6.4将RDD和case class关联
val personRDD = lineRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt))

6.5将RDD转换成DataFrame
val personDF = personRDD.toDF

6.6.对DataFrame进行处理
personDF.show

7 DataFrame常用操作

7.1 DSL风格

//查看DataFrame中的内容
personDF.show

//查看DataFrame部分列中的内容
personDF.select(personDF.col("name")).show
personDF.select(col("name"), col("age")).show
personDF.select("name").show

//打印DataFrame的Schema信息
personDF.printSchema

//查询所有的name和age,并将age+1
personDF.select(col("id"), col("name"), col("age") + 1).show
personDF.select(personDF("id"), personDF("name"), personDF("age") + 1).show

//过滤age大于等于18的
personDF.filter(col("age") >= 18).show

//按年龄进行分组并统计相同年龄的人数

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

7.2 SQL风格

如果想使用SQL风格的语法,需要将DataFrame注册成表
personDF.registerTempTable("t_person")

//查询年龄最大的前两名

val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

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

//显示表的Schema信息

sqlContext.sql("desc t_person").show

8 API

case class Person(id: Int, name: String, age: Int)

//创建SparkConf()并设置App名称
 

   val conf = new SparkConf().setAppName("SQL-1")
 

   //SQLContext要依赖SparkContext
   

 val sc = new SparkContext(conf)
    

//创建SQLContext
   

 val sqlContext = new SQLContext(sc)

   

 //从指定的地址创建RDD
    

val lineRDD = sc.textFile("file:///....").map(_.split(" "))

    

//创建case class
    //将RDD和case class关联
    

val personRDD = lineRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt))
    

//导入隐式转换,如果不到人无法将RDD转换成DataFrame
   

 //将RDD转换成DataFrame
  

  import sqlContext.implicits._
   

 val personDF = personRDD.toDF
    

//注册表
    

personDF.registerTempTable("t_person")
   

 //传入SQL
    

val df = sqlContext.sql("select * from t_person order by age desc limit 2")
   

 //将结果以JSON的方式存储到指定位置
   

 df.write.json("file:///...")
   

 //停止Spark Context


    sc.stop()









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值