1. Spark Shell と Spark SQL モードを理解する
2. Spark Shell と Spark SQL モードを使用してテーブルを作成し、データをクエリする方法を学びます
実験原理
Spark SQL の前身は Shark です。Shark は、Berkeley Lab の Spark エコシステムのコンポーネントの 1 つです。Spark エンジン上で実行できるため、SQL クエリの速度が 10 ~ 100 倍向上します。しかし、Spark の開発により、 , Shark は Hive に依存しすぎるため (Hive の構文パーサー、クエリ オプティマイザーの使用など)、Spark が確立したポリシーである One Stack Rule Them All を制限し、Spark のさまざまなコンポーネントの相互統合を制限するため、SparkSQL が提案されました。プロジェクト。
SparkSQL は、元の Shark コードを放棄し、インメモリ列ストレージ (In-MemoryColumnarStorage)、Hive 互換性などの Shark の利点の一部を吸収し、SparkSQL コードを再開発しました。Hive への依存性がなくなったため、SparkSQL は次のことを行うことができます。互換性、パフォーマンスの最適化、コンポーネントの拡張がすべて大幅に容易になりました。
(Spark SQL実行処理)
SQLContext の具体的な実行プロセスは次のとおりです。
(1) SQL | HQL ステートメントは、SqlParse を通じて UnresolvedLogicalPlan に解析されます。
(2) アナライザとデータディクショナリ(カタログ)を組み合わせたバインディングを使用して、解決済みLogicalPlanを生成する際、カタログはSchemRDDを抽出し、ケースクラスと同様のオブジェクトを登録し、テーブルをメモリに登録します。
(3) 分析された論理プランが Catalyst Optimizer オプティマイザーによって最適化された後、最適化された論理プランが生成され、このプロセスが完了すると、Spark コア内で以下の部分が完成します。
(4) 最適化された論理プランの結果は SparkPlanner に送信され、SparkPlanner で処理されて PhysicalPlan に送信され、Spark Plan が生成されます。
(5) SparkPlan を使用して LogicalPlan を PhysicalPlan に変換します。
(6) prepareForExecution() を使用して、PhysicalPlan を実行可能な物理プランに変換します。
(7)execute()を使用して、実行可能な物理計画を実行します。
(8) データフレームを生成します。
実行プロセス全体には、SqlParse、アナライザー、オプティマイザー、SparkPlan などの複数の SparkSQL コンポーネントが含まれます。
研究室環境
Linux Ubuntu 16.04
jdk-7u75-linux-x64
hadoop-2.6.0-cdh5.4.5
スカラ-2.10.5
スパーク-1.6.0-bin-hadoop2.6
実験内容
電子商取引プラットフォームでは、注文データを分析する必要があります。注文データには、注文データordersと注文詳細データorder_itemsという2つのファイルが含まれることが知られています。ordersには、注文ID、注文番号、ユーザーID、および購入した商品の注文が記録されます。ユーザーの日付。order_items は、製品 ID、注文 ID、および詳細 ID を記録します。それらの構造と関係を次の図に示します。
実験手順
1. まず、Hadoop 関連のプロセスが起動しているかどうかを確認します。起動していない場合は、/apps/hadoop/sbin ディレクトリに切り替えて、Hadoop を起動します。
- jps
- cd /apps/hadoop/sbin
- ./start-all.sh
2. Linux 上でローカルに新しい /data/spark5 ディレクトリを作成します。
- mkdir -p /data/spark5
3. /data/spark5 ディレクトリに切り替え、wget コマンドを使用して、http://172.16.103.12:60000/allfiles/spark5 の order と order_items をダウンロードします。
- cd /data/spark5
- wget http://172.16.103.12:60000/allfiles/spark5/orders
- wget http://172.16.103.12:60000/allfiles/spark5/order_items
4. まず、HDFS 上に新しい /myspark5 ディレクトリを作成し、/data/spark5 ディレクトリ内のorders ファイルと order_items ファイルを HDFS の /myspark5 ディレクトリにアップロードします。
- hadoop fs -mkdir /myspark5
- hadoop fs -put /data/spark5/orders /myspark5
- hadoop fs -put /data/spark5/order_items /myspark5
5. Spark Shell を起動します。
- スパークシェル
6. Spark-Shell で、ケース クラス メソッドを使用して RDD を定義し、注文テーブルを作成します。
- val sqlContext = 新しい org.apache.spark.sql.SQLContext(sc)
- インポート sqlContext.implicits._
- ケースクラス Orders(order_id:String,order_number:String,buyer_id:String,create_dt:String)
- val dforders = sc.textFile( "/myspark5/orders" ).map(_.split( '\t' )).map(line=>Orders(line(0),line(1),line(2), line(3))).toDF()
- dforders.registerTempTable( "注文" )
テーブルが正常に作成されたことを確認します。
- sqlContext.sql( "テーブルを表示" ).map(t=> "テーブル名は:" +t(0)).collect().foreach(println)
- sqlContext.sql( "注文から order_id、buyer_id を選択" ).collect
7. Spark Shell で、applyScheme を使用して RDD を定義し、order_items テーブルを作成します。
- org.apache.spark.sql._ をインポートします
- org.apache.spark.sql.types._ をインポートします
- val rddorder_items = sc.textFile( "/myspark5/order_items" )
- val roworder_items = rddorder_items.map(_.split( "\t" )).map( p=>Row(p(0),p(1),p(2) )
- val schemaorder_items = "アイテムID オーダーID 商品ID"
- val schema = StructType(schemaorder_items.split( " " ).map(fieldName=>StructField(fieldName,StringType, true )) )
- val dforder_items = sqlContext.applySchema(roworder_items, スキーマ)
- dforder_items.registerTempTable( "order_items" )
テーブルの作成が成功したことを確認します。
- sqlContext.sql( "テーブルを表示" ).map(t=> "テーブル名は:" +t(0)).collect().foreach(println)
- sqlContext.sql( "order_items から order_id、goods_id を選択します" ).collect
8. order テーブルと order_items テーブルを結合して、電子商取引 Web サイトのどのユーザーがどの製品を購入したかに関する統計を収集します。
- sqlContext.sql( "order_items からorders.buyer_id、order_items.goods_id を選択し、order_items.order_id=orders.order_id で注文を結合します " ).collect
9. Spark シェル モードを終了する
- 出口
以下は、Spark SQL モードを示しています。
10. Spark SQL を開始します。
- スパークSQL
11. テーブルordersとorder_itemsを作成します。
- テーブル注文の作成 (order_id 文字列、order_number 文字列、buyer_id 文字列、create_dt 文字列)
- 行形式の区切りフィールドは 「\t」で終了し、 テキストファイルとして保存されます。
- テーブル order_items(item_id 文字列,order_id 文字列,goods_id 文字列) を作成します
- 行形式の区切りフィールドは 「\t」で終了し、 テキストファイルとして保存されます。
12. 作成されたテーブルを表示します。
- テーブルを表示します。
テーブル名の後の false は、テーブルが一時テーブルではないことを意味します。
13. HDFS の /myspark5 の下にある order テーブルと order_items テーブルのデータを、作成した 2 つのテーブルにロードします。
- パス 「/myspark5/orders」のデータを テーブルordersにロードします。
- パス 「/myspark5/order_items」のデータを テーブル order_items にロードします。
14. データが正常にロードされたかどうかを確認します。
- 注文から * を選択します。
- select * from order_items;
15. ファイルを処理し、order テーブルと order_items テーブルを結合し、電子商取引 Web サイトに関する統計を作成して、どのユーザーがどの製品を購入したかを確認します。
- order_itemsからorders.buyer_id、order_items.goods_idを選択し、order_items.order_id=orders.order_id;で注文を結合します。