Spark SQL重点

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)

}
### 回答1: 1. 什么是Spark Core?它的作用是什么? Spark Core是Spark的核心组件,它提供了分布式任务调度、内存计算和数据存储等基础功能,是Spark的基础架构。Spark Core的作用是管理集群资源,将任务分配给集群中的节点进行计算,并将计算结果返回给驱动程序。 2. Spark SQL是什么?它的作用是什么? Spark SQLSpark生态系统中的一个组件,它提供了一种基于SQL语言的数据处理方式,可以方便地处理结构化数据。Spark SQL的作用是将结构化数据转换为RDD,然后利用Spark Core进行分布式计算,最后将计算结果返回给用户。 3. 什么是Spark Streaming?它的作用是什么? Spark Streaming是Spark生态系统中的一个组件,它提供了一种实时数据处理方式,可以对流式数据进行实时计算。Spark Streaming的作用是将流式数据分成一系列小批次进行处理,然后利用Spark Core进行分布式计算,最后将计算结果返回给用户。 4. Spark Core和Spark SQL的区别是什么? Spark Core是Spark的核心组件,提供了分布式任务调度、内存计算和数据存储等基础功能;而Spark SQL是基于SQL语言的数据处理组件,可以方便地处理结构化数据。Spark Core主要用于处理非结构化数据,而Spark SQL主要用于处理结构化数据。 5. Spark Streaming和Spark Core的区别是什么? Spark Streaming是Spark生态系统中的一个组件,提供了一种实时数据处理方式,可以对流式数据进行实时计算;而Spark Core是Spark的核心组件,提供了分布式任务调度、内存计算和数据存储等基础功能。Spark Streaming主要用于处理实时数据,而Spark Core主要用于处理批处理数据。 ### 回答2: Spark是一个快速、通用、可扩展的计算引擎,可以处理大规模的数据。Spark的核心是Spark Core,它提供了任务调度、内存管理、错误恢复和与存储系统的交互等基本功能,同时还提供了对分布式数据集的RDD(Resilient Distributed Datasets)的支持。 以下是大数据基础面试题五中的关于Spark Core的问题及回答: 1. 什么是Spark Core? Spark Core是Spark的核心组件,提供了Spark的核心功能。它是一个通用型计算引擎,可用于大规模数据处理和分布式系统开发。 2. Spark Core有哪些特征? Spark Core有以下特征: (1)速度快:通过内存计算和基于迭代式计算模型的优化,Spark可以比MapReduce更快地进行大规模数据处理。 (2)用户友好:Spark提供了Scala、Java和Python等编程语言的API,支持丰富的数据处理操作,如Map、Filter、Reduce和Join等。 (3)内存计算:Spark将数据缓存在内存中,可在运行时动态调整内存使用情况,这一特性使得Spark更加高效。 (4)易于扩展:Spark可在多个节点上运行,并支持动态添加节点,从而更好地处理大规模数据处理任务。 3. Spark Core与Hadoop的MapReduce有何不同? 与Hadoop的MapReduce相比,Spark Core具有以下不同之处: (1)速度快:Spark采用基于内存的计算方式,不需要将数据频繁写入磁盘,从而能够比MapReduce更快地处理数据。 (2)支持更多的操作:Spark提供了更多的操作,如Filter、Join、GroupBy和Distinct等,而MapReduce只支持Map和Reduce操作。 (3)缓存机制:Spark支持缓存数据,避免了MapReduce需要重复读取磁盘数据的问题。 4. RDD是什么?它有哪些特征? RDD是Resilient Distributed Dataset的缩写,指弹性分布式数据集。它是Spark的核心数据结构之一。RDD被设计为可靠、高度可扩展的数据处理模型,可以在多个节点上进行并行计算。 RDD具有以下特征: (1)分片:RDD将数据划分为多个小的数据块,然后在不同的节点上并行处理。 (2)不可变:RDD是不可变的,一旦创建就无法修改,只能进行转换操作来创建新的RDD。 (3)容错:RDD具有容错机制,如果有节点出现故障,Spark可以自动重新计算数据。 (4)缓存:RDD支持缓存机制,缓存后可以在内存中快速访问数据。 5. 如何创建RDD? 创建RDD需要以下步骤: (1)获取SparkContext对象:首先需要创建一个SparkContext对象,它是管理Spark应用程序的入口点。 (2)获取数据:从文件系统、HDFS或其他数据源中获取数据。 (3)创建RDD:通过将数据分割为一组元素来创建RDD。 例如,以下代码可以从文件系统中获取数据,并创建一个RDD: val sc = new SparkContext(“local”, “Word Count App”) val lines = sc.textFile(“/path/to/file”) val words = lines.flatMap(line => line.split(“ “)) val wordCounts = words.map(word => (word, 1)).reduceByKey((a, b) => a + b) ### 回答3: Spark Core是Apache Spark的最基本组成部分,它主要负责管理整个Spark集群及其资源,并支持在集群上进行分布式数据处理。它提供了分布式任务的调度、内存管理、任务的容错等核心功能。下面就Spark Core的一些重要特性进行详细介绍。 1. RDD数据模型:RDD的全称是Resilient Distributed Datasets,叫做弹性分布式数据集。它是Spark Core的核心概念,用于存储和处理分布式数据。RDD的特点是容错、分布式和数据流式处理,并且可以进行缓存、存储和检索等操作。RDD在Spark核心计算引擎中发挥着重要的作用。 2. 分布式任务调度:Spark Core可以自动将任务分配到整个集群中的多个节点上进行处理。Spark可以按照一定的优先级或算法将任务分解成多个小任务,并对这些任务进行动态地调度管理。Spark的调度器支持动态调整任务的优先级和切换运算模式。 3. 内存管理机制:Spark Core可以通过任务的内存使用限制,对每个任务进行内存管理和限制,自动捕获运行过程中的内存错误,并且可以及时恢复失败的任务。此外,Spark还提供了多种内存管理标准和检查机制,方便用户了解程序的运行情况和内存使用状态。 4. 任务容错机制:在高并发环境下,任务容错机制非常关键。Spark Core提供了一系列的容错机制和恢复机制,例如,当一个节点发生了故障或者内存错误时,Spark会自动将处理不完的任务重新分发到另一个可用节点上进行处理。 5. 实时数据处理:Spark Core提供了不少实时数据处理的功能及接口。它可以进行实时数据的流式处理,支持基于时间滑动窗口的数据操作及处理,以及对实时数据的统计、分析和监控处理等。 通过对这些特性的了解,可以更好地理解Spark Core的实际应用场景,并且可以在面试过程中更好地回答Spark Core相关的问题。需要注意的是,Spark Core在实际应用中还有很多细节和复杂的问题需要考虑,需要认真学习和实践才能掌握和应用好它的各种特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值