Spark-sql-programmatically-specifying-schema
プログラムによるスキーマの指定
DataFrameを作成する2番目の方法は、スキーマを構築し、それを既存のRDDに適用できるプログラムインターフェイスを使用することです。 次の3つの手順を使用して、プログラムでDataFrameを作成できます。
- 元のRDDから行のRDDを作成します。
- 手順1で作成したRDDの行の構造に一致するStructTypeで表されるスキーマを作成します。
- SQLContextが提供するcreateDataFrameメソッドを介してスキーマを行のRDDに適用します。
例
指定されたデータ-スパークシェルポイントが実行されている現在のそれぞれのディレクトリにある employee.txt という名前のファイルの次のデータを確認します。
以下の手順に従って、スキーマをプログラムで生成します。
Spark Shellを開く
次の例を使用して、Sparkシェルを起動します。
SQLContextオブジェクトを作成する
次のコマンドを使用してSQLContextを生成します。 ここで、 sc はSparkContextオブジェクトを意味します。
テキストファイルから入力を読み取る
次のコマンドを使用して employee.txt という名前のテキストファイルからデータを読み取り、RDD DataFrameを作成します。
文字列形式でエンコードされたスキーマを作成する
次のコマンドを使用して、エンコードされたスキーマを文字列形式で作成します。 つまり、テーブルのフィールド構造を想定し、区切り文字を使用してフィールド名を渡します。
出力
各APIのインポート
次のコマンドを使用して、行機能とSQLデータ型をインポートします。
スキーマを生成する
次のコマンドは、 schemaString 変数を読み取ってスキーマを生成するために使用されます。 これは、デフォルトで文字列全体を区切り文字としてスペースで分割して各フィールドを読み取り、各フィールドタイプを文字列タイプにする必要があることを意味します。
テキストファイルからデータを読み取るための変換を適用する
次のコマンドを使用して、RDD(従業員)を行に変換します。 つまり、ここではRDDデータを読み取り、rowRDDに格納するためのロジックを指定しているということです。 ここでは、2つのマップ関数を使用しています。1つはレコード文字列を分割するための区切り文字(。* map(_。split( "、")))で、2つ目のマップ関数はフィールドインデックス値(。 map(e⇒Row(e(0).trim.toInt、e(1)、e(2).trim.toInt))*)。
スキーマに基づいて行データにRowRDDを適用する
出力
DataFrameデータをテーブルに保存する
次のコマンドを使用して、DataFrameを employee という名前のテーブルに保存します。
DataFrameでクエリを選択
出力
メソッド sqlContext.sql を使用すると、実行時まで列とその型が不明な場合にDataFramesを構築できます。 これで、さまざまなSQLクエリを実行できます。