目前在Spark中,SparkSQL用的是最多的,Spark Streaming次之,所以將Spark SQL相關官方文檔翻譯下,官方文檔是最好的學習資料。
概述
Spark SQL是用於結構化數據處理的Spark模塊。與基本Spark RDD API不同,Spark SQL提供的接口爲Spark提供了有關數據結構和正在執行的計算的更多信息。在內部,Spark SQL使用這些額外的信息來執行額外的優化。 有幾種方法與Spark SQL(包括SQL和Dataset API)進行交互。當計算結果時,使用相同的執行引擎,獨立於用來表示計算的哪種API 或者語言。 這種統一意味着開發人員可以容易地在不同的API之間來回切換,基於這些API提供了表達給定變換的最自然的方式。
此頁面上的所有示例都使用Spark發行版中包含的示例數據,並且可以在spark-shell,pyspark shell或sparkR shell中運行。
SQL
Spark SQL的一個用途是執行SQL查詢。 Spark SQL還可以用於從現有安裝的Hive中讀取數據。 有關如何配置此功能的更多信息,請參閱Hive表部分。 當在另一種編程語言中運行SQL時,結果將作爲Dataset / DataFrame返回。 您還可以與SQL接口交互,使用命令行或通過JDBC / ODBC。
Datasets和DataFrames
一個Dataset 是數據的分佈式集合。數據集是在Spark 1.6中添加的一個新接口,它提供了RDD的優點(強類型化,使用強大的lambda函數的能力)以及Spark SQL優化後的執行引擎的優點。一個Dataset 可以從JVM對象構造,然後使用函數轉換(map, flatMap,filter等)去操作。 Dataset API 支持Scala和Java。 Python不支持Dataset API。但是由於Python的動態特性,Dataset API的許多優點已經可用(即,您可以通過名稱row.columnName自然地訪問行的字段)。 R的情況是類似的。
DataFrame是組織成命名列的Dataset 。它在概念上等同於關係數據庫中的表或R / Python中的數據框架,但在底層具有更豐富的優化。 DataFrames可以從各種來源構建,例如:結構化數據文件,Hive中的表,外部數據庫或現有RDDs。 DataFrame API支持的語言有Scala,Java,Python和R。在Scala和Java中,DataFrame由Rows
的一個Dataset表示。在Scala API中,DataFrame只是Dataset [Row]的類型別名。而在Java API中,用戶需要使用Dataset <Row>
來表示DataFrame。
在本文檔中,我們經常將Scala / Java Datasets 的Rows 作爲DataFrames。
入門
起始點:SparkSession
Scala:
Spark中所有功能的入口點是SparkSession類。 要創建基本的SparkSession
,只需使用SparkSession.builder()
:
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._
在Spark repo中的“examples / src / main / scala / org / apache / spark / examples / sql / SparkSQLExample.scala”
下找到完整的示例代碼。
Spark 2.0中的SparkSession爲Hive功能提供了內置支持,包括使用HiveQL編寫查詢,訪問Hive UDF以及從Hive表中讀取數據的能力。 要使用這些功能,您不需要具有現有的Hive設置。
Java:
SparkSession 類
import org.apache.spark.sql.SparkSession;
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate();
在Spark repo中的
examples/src/main/java/org/apache/spark/examples/sql/JavaSparkSQLExample.java
下找到完整的示例代碼。
創建DataFrames
Scala:
使用SparkSession,應用程序可以從現有RDD,Hive表或Spark數據源創建DataFrames。
例如,以下內容根據JSON文件的內容創建DataFrame:
val df = spark.read.json("examples/src/main/resources/people.json")
// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
在Spark repo中的“examples / src / main / scala / org / apache / spark / examples / sql / SparkSQLExample.scala”下找到完整的示例代碼。
Java:
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");
// Displays the content of the DataFrame to stdout
df.show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
在Spark repo中的“examples / src / main / java / org / apache / spark / examples / sql / JavaSparkSQLExample.java”中查找完整的示例代碼。
未完,接下來會對Spark SQL以下幾點做介紹:
數據源
性能調優
分佈式SQL引擎
- Spark SQL 遷移指南(Spark SQL 版本升級、兼容Apache Hive)