Spark Sql,Dataframe和資料集指南
概述
Spark SQL是一個spark模組,主要用於結構化資料的處理。不像基礎的spark RDD的API那麼抽象,該介面能夠對資料和資料的計算提供更多的資訊。Spark SQL使用這些額外的資訊來增加額外的優化。有很多種方式來與Spark SQL互動,包括了SQL語句,DataFrame API和Datasets API,因此使用者可以輕鬆的在這些方式中來進行切換,從而讓使用更加方便。
下面所有的例子都可以在spark-shell,pyspark shell或者sparkR shell中執行。
SQL
Spark SQL的一個功能就是執行常見的SQL指令或者HiveQL指令。spark sql可以從hive中讀取資料。對於如何配置這個功能,可以參考下面hive tables(http://spark.apache.org/docs/latest/sql-programming-guide.html#hive-tables)部分,當使用SQL來處理資料時,將會以DataFrame的形式返回資料。你也可以跟SQL互動通過使用命令列的形式或者JDBC或者ODBC,下面會講到。
DataFrames
一個DataFrame是一個分散式的資料集合,通過列的方式來組織資料。下面的圖很好的展示了dataframe和RDD的區別,dataframe中比RDD增加了schema資訊,可以對資料的列資訊進行描述,從而比RDD使用起來更加高效。
Datasets
一個Dataset是在spark1.6中一個新的實驗性的介面,旨在嘗試提供RDD的優勢,(強型別,能夠使用更強大的lambda函式)通過使用spark sql的優化後的執行引擎。一個Dataset可以通過JVM中的objects來進行組織,然後可以通過(map,flatMap,filter等)來進行轉化。
開始
出發點:SQLContext
下面的例子都是都是以java的方式來進行說明,其實由於scala也是執行在jvm中,因此在程式中有很多相似之處。
進入Spark SQL的入口函式就是SQLContext,就類似c++中的main函式,建立SQLContext的方式就是通過使用SparkContext
JavaSparkContext sc = ...;
SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc);
下面這條語句是從sparkcontext中new出一個sqlcontext,sqlcontext是sparkcontext的子方法。
除了基本的SQLContext外,也可以建立一個HiveContext,HiveContext是基礎的SQLContext功能的超集