スパークシリーズ(8)は、 - SQLのデータフレームおよびデータセットをスパーク

、SQL入門スパーク

スパークSQLスパークは、一つのサブモジュールは、主に構造化されたデータを操作するために使用されています。それは次の機能があります。

  • SQLクエリを使用すると、構造化データを照会するためにSQLまたはデータフレームAPIを使用することができますスパークプログラムとシームレスにブレンドすることができます。
  • 複数のプログラミング言語をサポート。
  • これは、ハイブ、アブロ、寄木張り、ORC、JSONやJDBCなどを含む外部データソース、数百人をサポートしています。
  • 既存のハイブの倉庫にアクセスできるようにサポートHiveQL文法とハイブのSerDesとUDF;
  • これは、標準のJDBCやODBC接続をサポートしています。
  • これは、カラムのコード生成と貯蔵特性を最適化サポートしています。
  • 拡大を支援し、耐障害性を確保するために。

https://github.com/heibaiying

二、データフレーム&データセット

2.1データフレーム

構造化データの処理をサポートするために、スパークSQLは、新しいデータ構造のデータフレームを提供します。データフレームは、データセットの組成物で終了します。これは、リレーショナルデータベースのテーブルまたはR / Python言語と概念的に等価ですdata frameスパークSQL開発者は複数の言語をサポートしているため、その各言語が定義されDataFrame、特に以下の、抽象的に:

言語 主な抽象
スカラ データセット[T]&データフレーム(データセット[行]的别名)
ジャワ データセット[T]
パイソン データフレーム
R データフレーム

2.2データフレームのコントラストRDDS

データフレームRDDSとの主な違いは、構造化データのために、非構造化データは、次のように内部データ構造がある面であることです。

https://github.com/heibaiying

内部データフレーム明確なスキームの構造、その列名、列のフィールドタイプが知られているが、これの利点は、あなたが読み込まれたデータを減らすことができ、より良いクエリの効率性を確保するための実行計画を最適化することです。

データフレームとRDDSはどのように選ぶべきなのでしょうか?

  • あなたはむしろDATAFRAME APIよりも、関数型プログラミングを使用したい場合は、RDDSを使用して、
  • あなたのデータは、(例えばストリーミングメディアや文字ストリームなど)構造化されていない場合は、RDDSを使用し、
  • あなたが構造化された(たとえば、RDBMS内のデータなど)のデータや半構造化(例えば、ログ)されている場合は、パフォーマンスを考慮して、データフレームを優先しなければなりません。

2.3データセット

データセットは、それがラムダ関数をサポートしながら、強く型付けされた特性を有する、RDD及びデータフレームの長所を統合するが、唯一のScalaとJava言語で使用することができるスパーク1.6バージョンを導入し、分散したデータの集合です。スパーク2.0後、現像剤を容易にするために、スパーク及びデータセットのAPI、すなわち、ユーザは、標準的なAPIの両方の操作を完了することができる場合があり、構造化されたAPI(構造化API)を提供する、互いに融合データフレームう。

ここで注意してください:DATAFRAMEが後だろう、両方の型指定されたAPIを説明するために、DataSetをマークされている型指定されていないAPIを、マークされています。

https://github.com/heibaiying

2.4静的な型と実行時の型の安全性

静的タイプ(静的タイピング)とランタイム型安全(ランタイム型安全性)は、主に次のように

実際の使用では、保存する(あなたは構文エラーを見つけるだろうし、あなたがデータフレームとデータセットを使用している場合、それはコンパイル時のエラーで見つけることができるまであなたは、ランタイムをスパークSQLクエリを使用している場合開発時間と全体的なコスト)。データフレームとデータセットの主な違いは次のとおりです。

データフレームでは、あなたがAPIの外側の関数を呼び出すときに、コンパイラはエラーを報告しますが、あなたは存在しないフィールド名を使用する場合、コンパイラはまだ見つけることができません。データセットとAPIの機能が使用されており、JVMラムダ型オブジェクト表現は、すべてのタイプのパラメータは、コンパイル時に一致しないことが判明します。

これらは、構文エラーの開発と分析に対応し、マップのタイプに関して究極の安全性と解釈されます。アトラスでは、データセットの最も厳しいが、開発者のための最高の効率。

<div align="center"> <img width="600px" src="https://raw.githubusercontent.com/heibaiying/BigData-Notes/master/pictures/spark-运行安全.png"/>; </div>
上面的描述可能并没有那么直观,下面的给出一个 IDEA 中代码编译的示例:

https://github.com/heibaiying

这里一个可能的疑惑是 DataFrame 明明是有确定的 Scheme 结构 (即列名、列字段类型都是已知的),但是为什么还是无法对列名进行推断和错误判断,这是因为 DataFrame 是 Untyped 的。

2.5 Untyped & Typed

在上面我们介绍过 DataFrame API 被标记为 Untyped API,而 DataSet API 被标记为 Typed API。DataFrame 的 Untyped 是相对于语言或 API 层面而言,它确实有明确的 Scheme 结构,即列名,列类型都是确定的,但这些信息完全由 Spark 来维护,Spark 只会在运行时检查这些类型和指定类型是否一致。这也就是为什么在 Spark 2.0 之后,官方推荐把 DataFrame 看做是 DatSet[Row],Row 是 Spark 中定义的一个 trait,其子类中封装了列字段的信息。

相对而言,DataSet 是 Typed 的,即强类型。如下面代码,DataSet 的类型由 Case Class(Scala) 或者 Java Bean(Java) 来明确指定的,在这里即每一行数据代表一个 Person,这些信息由 JVM 来保证正确性,所以字段名错误和类型错误在编译的时候就会被 IDE 所发现。

case class Person(name: String, age: Long)
val dataSet: Dataset[Person] = spark.read.json("people.json").as[Person]

三、DataFrame & DataSet & RDDs 总结

这里对三者做一下简单的总结:

  • RDDs 适合非结构化数据的处理,而 DataFrame & DataSet 更适合结构化数据和半结构化的处理;
  • DataFrame & DataSet 可以通过统一的 Structured API 进行访问,而 RDDs 则更适合函数式编程的场景;
  • 相比于 DataFrame 而言,DataSet 是强类型的 (Typed),有着更为严格的静态类型检查;
  • DataSets、DataFrames、SQL 的底层都依赖了 RDDs API,并对外提供结构化的访问接口。

<div align="center"> <img width="600px" src="https://raw.githubusercontent.com/heibaiying/BigData-Notes/master/pictures/spark-structure-api.png"/>; </div>

四、Spark SQL的运行原理

DataFrame、DataSet 和 Spark SQL 的实际执行流程都是相同的:

  1. 进行 DataFrame/Dataset/SQL 编程;
  2. 如果是有效的代码,即代码没有编译错误,Spark 会将其转换为一个逻辑计划;
  3. Spark 将此逻辑计划转换为物理计划,同时进行代码优化;
  4. Spark 然后在集群上执行这个物理计划 (基于 RDD 操作) 。

4.1 逻辑计划(Logical Plan)

执行的第一个阶段是将用户代码转换成一个逻辑计划。它首先将用户代码转换成 unresolved logical plan(未解决的逻辑计划),之所以这个计划是未解决的,是因为尽管您的代码在语法上是正确的,但是它引用的表或列可能不存在。 Spark 使用 analyzer(分析器) 基于 catalog(存储的所有表和 DataFrames 的信息) 进行解析。解析失败则拒绝执行,解析成功则将结果传给 Catalyst 优化器 (Catalyst Optimizer),优化器是一组规则的集合,用于优化逻辑计划,通过谓词下推等方式进行优化,最终输出优化后的逻辑执行计划。

https://github.com/heibaiying

4.2 物理计划(Physical Plan)

得到优化后的逻辑计划后,Spark 就开始了物理计划过程。 它通过生成不同的物理执行策略,并通过成本模型来比较它们,从而选择一个最优的物理计划在集群上面执行的。物理规划的输出结果是一系列的 RDDs 和转换关系 (transformations)。

https://github.com/heibaiying

4.3 执行

在选择一个物理计划后,Spark 运行其 RDDs 代码,并在运行时执行进一步的优化,生成本地 Java 字节码,最后将运行结果返回给用户。

参考资料

  1. Matei Zaharia, Bill Chambers . Spark: The Definitive Guide[M] . 2018-02
  2. Spark SQL, DataFrames and Datasets Guide
  3. 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset(译文)
  4. A Tale of Three Apache Spark APIs: RDDs vs DataFrames and Datasets(原文)

もっと大きなデータ系列は、GitHubのオープンソースプロジェクトを見つけることができますビッグデータははじめに

おすすめ

転載: blog.51cto.com/14183932/2440196