SparkSQL 基本使用

简介

  • SparkSQL可以直接使用SQL的方式处理结构化数据,也可以通过DataFrame(spark1.3)和Dataset(spark1.6) API 使用编程的方式处理结构化数据,本文只介绍以DataFrame API的方式编程,至于DataFrame 和Daraset有何不同,我们暂时将二者先理解为一个概念,DataFrame API支持多种编程语言,如Java,Scala,Python,R,这就意味着开发人员可以采用自己熟悉的语言编程。

SparkSession

  • Spark2.0中引入了SparkSession的概念,它为用户提供了一个统一的切入点来使用Spark的各项功能,用户可以使用DataFrame和Dataset的各种API,在Spark2.0版本之前,创建一个Spark应用程序就必须要使用一个SparkConf和SparkContext,SparkSession封装了SparkConf、SparkContext和SQLContext,因此创建一个以SparkSQL编程的应用程序,只需要创建一个SparkSession。
  • 创建SparkSession

    import org.apache.spark.sql.SparkSession
    
    val spark = SparkSession
    .builder()
    .appName("Spark SQL basic example")
    .config("spark.some.config.option", "some-value")
    .enableHiveSupport() #支持hive的一些特性,如udf,序列化与反序列化
    .getOrCreate()
    
    // For implicit conversions like converting RDDs to DataFrames
    import spark.implicits._   #使用隐式转换
    

DataFrame

  • DataFrame 可以理解为具有Schema结构的RDD,并采用列式存储,他相对于RDD,可以从数据中读取到更多信息,因此可以做更多的优化.
  • 那么怎样将数据转成一个DataFrame呢? DataFrame API 对具有Schema信息的数据提供了format()和load()方法可以将不同格式和内部数据源的数据加载为DataFrame;当然,对外部数据源,DataFrame也提供了很好的支持,并且可以将非结构化数据以RDD的方式进行转换成DataFrame。
eg:读取json文件
    val peopledf=spark.read.format("json").load("file:///data/people.json")
    peopledf.show #这里的show方法默认显示前20行数据
    +----+-------+
    | age|   name|
    +----+-------+
    |null|Michael|
    |  30|   Andy|
    |  19| Justin|
    +----+-------+
    第一句也可以简写为:val peopledf=spark.read.json("file:///data/people.json")
  • printSchema()

     peopledf.printSchema()
    root
     |-- age: long (nullable = true)
     |-- name: string (nullable = true)
     列出了他的Schema结构(Tree)
    
  • select()

     peopledf.select("name").show
    +-------+
    |   name|
    +-------+
    |Michael|
    |   Andy|
    | Justin|
    +-------+
    peopledf.select("name","age").show 
    +-------+----+
    |   name| age|
    +-------+----+
    |Michael|null|
    |   Andy|  30|
    | Justin|  19|
    +-------+----+
    peopledf.select(df.col("name")).show
    +-------+
    |   name|
    +-------+
    |Michael|
    |   Andy|
    | Justin|
    +-------+
    peopledf.select('name).show  # 此方式需要import spark.implicits_ 导入隐式转换
    +-------+
    |   name|
    +-------+
    |Michael|
    |   Andy|
    | Justin|
    +-------+
    peopledf.select($"name",$"age"+10).show
    +-------+----------+
    |   name|(age + 10)|
    +-------+----------+
    |Michael|      null|
    |   Andy|        40|
    | Justin|        29|
    +-------+----------+
    
  • filter()

    peopledf.filter($"age">21).show
    +---+----+
    |age|name|
    +---+----+
    | 30|Andy|
    +---+----+
    
  • groupBy()

    peopledf.groupBy("age").count().show 
    +----+-----+
    | age|count|
    +----+-----+
    |  19|    1|
    |null|    1|
    |  30|    1|
    +----+-----+
    
  • show()

    show(num,truncate) 传入俩个参数,第一个控制显示行数,第二个控制是否显示全部信息
    
在DataFrame中使用SQL编程
  • SparkSession中的sql()函数可以让应用程序以编程的方式运行SQL查询语句,让结果返回一个DataFrame。

    // Register the DataFrame as a SQL temporary view
    peopledf.createOrReplaceTempView("people")
    val sqldf = spark.sql("select * from people")
    sqlDF.show()
    // +----+-------+
    // | age|   name|
    // +----+-------+
    // |null|Michael|
    // |  30|   Andy|
    // |  19| Justin|
    // +----+-------+
    

RDD与DataFrame的转换

方式一:Using Reflection
    val spark = SparkSession.builder()
          .appName("transferRDD")
          .master("lccal[2]")
          .getOrCreate()
    import spark.implicits._   # 导入隐式转换
        val dfRDD = spark.sparkContext.textFile("")
          .map(x =>x.split(",")).map(x=>Person(x(0),x(1).trim.toInt))
          .toDF() # 将RDD每个元素作用为case class

        spark.stop()
      }

    }
    case class Person(name:String,age:Int) #定义一个case class,在scala 2.10及之前版本只支持22个字段
方式二:Programmatically Specifying the Schema
    val spark = SparkSession.builder()
          .appName("")
          .master("")
          .getOrCreate()
        step1: #定义schema信息
        val schemaString = "name,age"
        val schemaType = schemaString.split(",")
          .map(x=> StructField(x,StringType,nullable = true))
        val schema=StructType(schemaType)

        step2: #将RDD转为rowRDD
        val RDD = spark.sparkContext.textFile("")
        val rowRDD = RDD.map(_.split(","))
          .map(x=>Row(x(0),x(1).trim))

        step3: #使用rowRDD和schema信息创建dataFrame
        val RDDdf = spark.createDataFrame(rowRDD,schema)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Spark SQL基本操作方法: 1. 创建 SparkSession 对象 ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("SparkSQL").getOrCreate() ``` 2. 读取数据源并创建 DataFrame ```python df = spark.read.format("csv").option("header", "true").load("path/to/file.csv") ``` 3. 注册 DataFrame 为临时表 ```python df.createOrReplaceTempView("temp_table_name") ``` 4. 执行 SQL 查询 ```python result = spark.sql("SELECT * FROM temp_table_name WHERE column_name = 'value'") ``` 5. 将 DataFrame 转换为 RDD ```python rdd = df.rdd ``` 6. 将 RDD 转换为 DataFrame ```python from pyspark.sql import Row rdd = sc.parallelize([(1, "John"), (2, "Bob"), (3, "Alice")]) df = rdd.map(lambda x: Row(id=x[0], name=x[1])).toDF() ``` 7. 将 DataFrame 保存到数据源 ```python df.write.format("csv").option("header", "true").save("path/to/save") ``` 演示: 假设我们有一个 csv 文件,包含以下内容: ``` id,name,age 1,John,25 2,Bob,30 3,Alice,28 ``` 我们可以使用以下代码读取该文件并创建 DataFrame: ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("SparkSQL").getOrCreate() df = spark.read.format("csv").option("header", "true").load("path/to/file.csv") df.show() ``` 输出结果为: ``` +---+-----+---+ | id| name|age| +---+-----+---+ | 1| John| 25| | 2| Bob| 30| | 3|Alice| 28| +---+-----+---+ ``` 接下来,我们可以将 DataFrame 注册为临时表并执行 SQL 查询: ```python df.createOrReplaceTempView("temp_table_name") result = spark.sql("SELECT * FROM temp_table_name WHERE age > 25") result.show() ``` 输出结果为: ``` +---+-----+---+ | id| name|age| +---+-----+---+ | 2| Bob| 30| | 3|Alice| 28| +---+-----+---+ ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值