Spark SQL重点

原创 2016年08月29日 12:51:30
Spark SQL允许Spark执行用SQL, HiveQL或者Scala表示的关系查询。这个模块的核心是一个新类型的RDD-SchemaRDD。 

1、使用反射来推断包含特定对象类型的RDD的模式(schema)。在你写spark程序的同时,当你已经知道了模式,这种基于反射的 方法可以使代码更简洁并且程序工作得更好。

例如


sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt))
people.registerTempTable("people")

/2、方法是通过一个编程接口来实现,这个接口允许你构造一个模式,然后在存在的RDDs上使用它。虽然这种方法更冗长,但是它允许你在运行期之前不知道列以及列 的类型的情况下构造SchemaRDDs。

import org.apache.spark._ 
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import SparkContext._ 
import org.apache.log4j.{Level, Logger}

object SparkSQL { 
  def main(args: Array[String]) { 
     //case class Customer(name:String,age:Int,gender:String,address: String)
    
    
     //屏蔽日志
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    val sparkConf = new SparkConf().setAppName("customers")
    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)
    
    val schema =
    StructType(
      StructField("name", StringType, false) ::
      StructField("age", IntegerType, true) :: Nil)

    val r = sc.textFile(args(0))
    val people = r.map(_.split(",")).map(p => Row(p(0), p(1).trim.toInt))
    
    val dataFrame = sqlContext.createDataFrame(people, schema)
    dataFrame.printSchema

    dataFrame.registerTempTable("people")
    sqlContext.sql("select * from people where age <25").collect.foreach(println)
 

输入的文件是下面这样
John,15
HanMM,20
Lixurui,27
Shanxin,22

输出结果
Spark <wbr>SQL重点


下面这种写法或许更清楚:
object SparkSQL { 
  def main(args: Array[String]) { 
   
     //屏蔽日志
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    val sparkConf = new SparkConf().setAppName("customers")
    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)
    
    // The schema is encoded in a string
    val schemaString = "name age"

    // Generate the schema based on the string of schema
    val schema =
      StructType(
        schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

    val people = sc.textFile(args(0))
    
    // Convert records of the RDD (people) to Rows.
    val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))
    
    val dataFrame = sqlContext.createDataFrame(rowRDD, schema)
    dataFrame.printSchema

    dataFrame.registerTempTable("people")
    sqlContext.sql("select * from people where age <25").collect.foreach(println)
 

Spark SQL能够自动推断JSON数据集的模式,加载它为一个SchemaRDD(最新的被DataFrame所替代)。这种转换可以通过下面两种方法来实现

  • jsonFile :从一个包含JSON文件的目录中加载。文件中的每一行是一个JSON对象
  • jsonRDD :从存在的RDD加载数据,这些RDD的每个元素是一个包含JSON对象的字符串

注意,作为jsonFile的文件不是一个典型的JSON文件,每行必须是独立的并且包含一个有效的JSON对象。结果是,一个多行的JSON文件经常会失败

例如people.json如下:

{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}


import org.apache.spark._ 
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import SparkContext._ 
import org.apache.log4j.{Level, Logger}

object SparkJSON { 
  def main(args: Array[String]) { 
    
     //屏蔽日志
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    val sparkConf = new SparkConf().setAppName("customers")
    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)
    
    
     // A JSON dataset is pointed to by path.
     // The path can be either a single text file or a directory storing text files.
    val path = "xrli/people.json"
    // Create a SchemaRDD from the file(s) pointed to by path
    val people = sqlContext.jsonFile(path)

    // The inferred schema can be visualized using the printSchema() method.
    people.printSchema()
// root
//  |-- age: integer (nullable = true)
//  |-- name: string (nullable = true)

    // Register this SchemaRDD as a table.
    people.registerTempTable("people")

    // SQL statements can be run by using the sql methods provided by sqlContext.
    val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")

// Alternatively, a SchemaRDD can be created for a JSON dataset represented by
// an RDD[String] storing one JSON object per string.
    val anotherPeopleRDD = sc.parallelize(
      """{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}""" :: Nil)
    val anotherPeople = sqlContext.jsonRDD(anotherPeopleRDD)
    
    anotherPeople.printSchema()
    anotherPeople.registerTempTable("anotherPeople")
    
    sqlContext.sql("SELECT name FROM anotherPeople")
 

结果
Spark <wbr>SQL重点

Spark SQL  还能跟hive互通,互通需要手动配置一下,参考下面 http://lxw1234.com/archives/2015/06/294.htm
然后就能使用了。比如写进代码
import org.apache.spark._ 
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import SparkContext._ 
import org.apache.log4j.{Level, Logger}

class SparkSQLHive {
   val sparkConf = new SparkConf().setAppName("customers")
   val sc = new SparkContext(sparkConf)
   val sqlContext = new  org.apache.spark.sql.hive.HiveContext(sc)
   
   sqlContext.sql("CREATE TABLE IF NOT EXISTS SparkHive (key INT, value STRING)")
   sqlContext.sql("LOAD DATA LOCAL INPATH 'xrli/kv1.txt' INTO TABLE src")

   // Queries are expressed in HiveQL
   sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

}

[2.6]Spark SQL 操作各种数据源笔记

参考spark官网 DT大数据梦工厂 spark sql操作各种数据源的数据流转 : 各种数据源的输入 => RDD(lines) =>RDD(Rows) => DataFrame(注...
  • PENGYUCHENG32109
  • PENGYUCHENG32109
  • 2016年06月01日 17:10
  • 2069

SparkSQL中的Sort实现(一)

SparkSQL中同样支持Order by和Sort by两种操作,本篇文章简单介绍Order by的分区间排序。...
  • doggie_wangtao
  • doggie_wangtao
  • 2016年12月18日 18:36
  • 1560

Spark SQL中的聚合(Aggregate)实现

Spark SQL中的聚合(Aggregate)实现Sort Based Aggregate首先来说说实现比较简单(但实际执行起来却不简单)的Sort Based Aggregate。顾名思义,这是一...
  • doggie_wangtao
  • doggie_wangtao
  • 2017年04月08日 16:50
  • 1732

scala&nbsp;重点语法总结

Scala 有两种变量, val 和 var  其中val不可变,var可变 val msg: String = "Hello yet again, world!" 或者类型推断 val msg =...
  • leexurui
  • leexurui
  • 2016年08月29日 12:51
  • 1709

Spark之性能优化(重点:并行流数据接收)

问题导读 1、如何减少批数据的执行时间? 2、Spark有哪些方面的性能优化? 3、有哪些错误我们需要关心? (一)减少批数据的执行时间 在Spark中有几个优化...
  • sdujava2011
  • sdujava2011
  • 2016年03月21日 09:41
  • 3231

Spark重点难点知识总结(一)

Master和Woker(相当于总经理和小组组长) Master:在基于standalone模式的Spark集群中,Cluster Manger就是Master,Master负责分配资源。Worke...
  • shuhaojie
  • shuhaojie
  • 2017年07月14日 16:33
  • 293

Scala Spark 得到最近一天的数据 重点:join

0.数据val data= """ user date item1 item2 1 2015-12-01 14 5.6 1 2015-12-01 10 0.6 1 20...
  • power0405hf
  • power0405hf
  • 2016年01月22日 13:35
  • 1318

Performance Tuning Tips for Running Spark Applications(重点:数据序列化)

Based on what I have read and experimented so far, I have provided some key factors that can impact ...
  • sdujava2011
  • sdujava2011
  • 2016年03月21日 14:30
  • 439

动网论坛sql(存储过程版)&amp;nbsp;

  • 2002年09月20日 00:00
  • 518KB
  • 下载

Spark&nbsp;源码和应用开发环境的构建

转自: Spark 源码和应用开发环境的构建 http://www.aboutyun.com/thread-16697-1-1.html (出处: about云开发) 问题导读: 1、如何在Ecli...
  • ltlf_21
  • ltlf_21
  • 2017年05月05日 15:07
  • 207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark&nbsp;SQL重点
举报原因:
原因补充:

(最多只允许输入30个字)