sparkSQL中Dataframe的使用

sparkSQL中Dataframe的使用

一、簡介

Spark SQL是Spark中的一個模塊,主要用於進行結構化數據的處理。它提供的最核心的編程抽象,就是DataFrame。同時Spark SQL還可以作爲分佈式的SQL查詢引擎。SparkSQL最重要的功能之一,就是從Hive中查詢數據。

DataFrame,可以理解爲是,以列的形式組織的,分佈式的數據集合。它其實和關係型數據庫中的表非常類似,但是底層做了很多的優化。DataFrame可以通過很多來源進行構建,包括:結構化的數據文件,Hive中的表,外部的關係型數據庫,以及RDD。

二、DataFrame的創建

要使用SparkSQL,首先就得創建一個創建一個SQLContext對象,或者是它的子類的對象,比如HiveContext的對象。

Scala版本:
val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._

spark2.X版本

Scala版本:
import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.executor.memory", "100g")
  .config("spark.cores.max", "72")
  .config("spark.dynamicAllocation.enabled", "false")
  .getOrCreate()

// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._

除了基本的SQLContext以外,還可以使用它的子類——HiveContext。HiveContext的功能除了包含SQLContext提供的所有功能之外,還包括了額外的專門針對Hive的一些功能。這些額外功能包括:使用HiveQL語法來編寫和執行SQL,使用Hive中的UDF函數,從Hive表中讀取數據。

要使用HiveContext,就必須預先安裝好Hive,SQLContext支持的數據源,HiveContext也同樣支持——而不只是支持Hive。對於Spark 1.3.x以上的版本,都推薦使用HiveContext,因爲其功能更加豐富和完善。

Spark SQL還支持用spark.sql.dialect參數設置SQL的方言。使用SQLContext的setConf()即可進行設置。對於SQLContext,它只支持“sql”一種方言。對於HiveContext,它默認的方言是“hiveql”。

dataframe的創建和操作
方法一:

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by cuiyufei on 2018/3/7.
  * dataframe實戰
  */
object sparkStudy {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("dataframeOperation").setMaster("local")
    val sc = new SparkContext(conf)
    val sparkSQL = new SQLContext(sc)
    val df = sparkSQL.read.json("f://spark//students.json")
    df.show()//打印DataFrame中所有的數據(select * from ...)
    df.printSchema()//打印DataFrame的元數據(Schema)
    df.select("name").show()//查詢某列所有的數據
    df.select(df("name"), df("age")+1).show()//查詢某幾列所有的數據,並對列進行計算
    df.filter(df("age")>18).show()// 根據某一列的值進行過濾
    df.groupBy("age").count().show()// 根據某一列進行分組,然後進行聚合
    df.createOrReplaceTempView("student")
    val stuDF = sparkSQL.sql("select * from student")
    stuDF.show()
  }

}

方法二:

import org.apache.spark.sql.SparkSession

/**
  * Created by cuiyufei on 2018/3/7.
  * dataframe實戰
  */
object sparkStudy {
  def main(args: Array[String]) {
    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
      .master("local")
      .getOrCreate()
    import spark.implicits._

    val df = spark.read.json("f://spark//students.json")
    df.show()//打印DataFrame中所有的數據(select * from ...)
    df.printSchema()//打印DataFrame的元數據(Schema)
    df.select("name").show()//查詢某列所有的數據
    //df.select(df("name"), df("age")+1).show()//查詢某幾列所有的數據,並對列進行計算
    df.select($"name", $"age"+1).show()//查詢某幾列所有的數據,並對列進行計算
    df.filter(df("age")>18).show()// 根據某一列的值進行過濾
    df.groupBy("age").count().show()// 根據某一列進行分組,然後進行聚合
    df.createOrReplaceTempView("student")
    val stuDF = spark.sql("select * from student")
    stuDF.show()
  }

}

students.json文件的內容如下:

{"name":"Leo", "score":85, "age": 25}
{"name":"Marry", "score":99, "age":18}
{"name":"Jack", "score":74, "age":18}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章