Spark SQL, DataFrames 和 Datasets 指南

目前在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 支持ScalaJava。 Python不支持Dataset API。但是由於Python的動態特性,Dataset API的許多優點已經可用(即,您可以通過名稱row.columnName自然地訪問行的字段)。 R的情況是類似的。

DataFrame是組織成命名列的Dataset 。它在概念上等同於關係數據庫中的表或R / Python中的數據框架,但在底層具有更豐富的優化。 DataFrames可以從各種來構建,例如:結構化數據文件,Hive中的表,外部數據庫或現有RDDs。 DataFrame API支持的語言有Scala,Java,PythonR。在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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章