Hadoop ベースの SparkSQL

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 を起動します。

プレーンコピーを表示 

  1. jps  
  2. cd /apps/hadoop/sbin  
  3. ./start-all.sh  

2. Linux 上でローカルに新しい /data/spark5 ディレクトリを作成します。

プレーンコピーを表示 

  1. mkdir -p /data/spark5  

3. /data/spark5 ディレクトリに切り替え、wget コマンドを使用して、http://172.16.103.12:60000/allfiles/spark5 の order と order_items をダウンロードします。

プレーンコピーを表示 

  1. cd /data/spark5  
  2. wget http://172.16.103.12:60000/allfiles/spark5/orders  
  3. wget http://172.16.103.12:60000/allfiles/spark5/order_items  

4. まず、HDFS 上に新しい /myspark5 ディレクトリを作成し、/data/spark5 ディレクトリ内のorders ファイルと order_items ファイルを HDFS の /myspark5 ディレクトリにアップロードします。

プレーンコピーを表示 

  1. hadoop fs -mkdir /myspark5  
  2. hadoop fs -put /data/spark5/orders /myspark5  
  3. hadoop fs -put /data/spark5/order_items /myspark5  

5. Spark Shell を起動します。

プレーンコピーを表示 

  1. スパークシェル  

6. Spark-Shell で、ケース クラス メソッドを使用して RDD を定義し、注文テーブルを作成します。

プレーンコピーを表示 

  1. val sqlContext = 新しい org.apache.spark.sql.SQLContext(sc)  
  2. インポート sqlContext.implicits._  
  3. ケースクラス Orders(order_id:String,order_number:String,buyer_id:String,create_dt:String)   
  4. val dforders = sc.textFile( "/myspark5/orders" ).map(_.split( '\t' )).map(line=>Orders(line(0),line(1),line(2), line(3))).toDF()  
  5. dforders.registerTempTable( "注文" )  

テーブルが正常に作成されたことを確認します。

プレーンコピーを表示 

  1. sqlContext.sql( "テーブルを表示" ).map(t=> "テーブル名は:" +t(0)).collect().foreach(println)  
  2. sqlContext.sql( "注文から order_id、buyer_id を選択" ).collect  

7. Spark Shell で、applyScheme を使用して RDD を定義し、order_items テーブルを作成します。

プレーンコピーを表示 

  1.  org.apache.spark.sql._  をインポートします
  2.  org.apache.spark.sql.types._  をインポートします
  3. val rddorder_items = sc.textFile( "/myspark5/order_items" )  
  4. val roworder_items = rddorder_items.map(_.split( "\t" )).map( p=>Row(p(0),p(1),p(2) )  
  5. val schemaorder_items =  "アイテムID オーダーID 商品ID"  
  6. val schema = StructType(schemaorder_items.split( " " ).map(fieldName=>StructField(fieldName,StringType, true )) )  
  7. val dforder_items = sqlContext.applySchema(roworder_items, スキーマ)  
  8. dforder_items.registerTempTable( "order_items" )  

テーブルの作成が成功したことを確認します。

プレーンコピーを表示 

  1. sqlContext.sql( "テーブルを表示" ).map(t=> "テーブル名は:" +t(0)).collect().foreach(println)  
  2. sqlContext.sql( "order_items から order_id、goods_id を選択します" ).collect  

8. order テーブルと order_items テーブルを結合して、電子商取引 Web サイトのどのユーザーがどの製品を購入したかに関する統計を収集します。

プレーンコピーを表示 

  1. sqlContext.sql( "order_items からorders.buyer_id、order_items.goods_id を選択し、order_items.order_id=orders.order_id で注文を結合します " ).collect  

9. Spark シェル モードを終了する

プレーンコピーを表示 

  1. 出口  

以下は、Spark SQL モードを示しています。

10. Spark SQL を開始します。

プレーンコピーを表示 

  1. スパークSQL  

11. テーブルordersとorder_itemsを作成します。

プレーンコピーを表示 

  1. テーブル注文の作成 (order_id 文字列、order_number 文字列、buyer_id 文字列、create_dt 文字列)  
  2. 行形式の区切りフィールドは 「\t」で終了し、  テキストファイルとして保存されます。  

プレーンコピーを表示 

  1. テーブル order_items(item_id 文字列,order_id 文字列,goods_id 文字列) を作成します  
  2. 行形式の区切りフィールドは 「\t」で終了し、  テキストファイルとして保存されます。  

12. 作成されたテーブルを表示します。

プレーンコピーを表示 

  1. テーブルを表示します。  

テーブル名の後の false は、テーブルが一時テーブルではないことを意味します。

13. HDFS の /myspark5 の下にある order テーブルと order_items テーブルのデータを、作成した 2 つのテーブルにロードします。

プレーンコピーを表示 

  1. パス 「/myspark5/orders」のデータを テーブルordersにロードします。  
  2. パス 「/myspark5/order_items」のデータを テーブル order_items にロードします。  

14. データが正常にロードされたかどうかを確認します。

プレーンコピーを表示 

  1. 注文から * を選択します。  
  2. select * from order_items; 

15. ファイルを処理し、order テーブルと order_items テーブルを結合し、電子商取引 Web サイトに関する統計を作成して、どのユーザーがどの製品を購入したかを確認します。

プレーンコピーを表示 

  1. order_itemsからorders.buyer_id、order_items.goods_idを選択し、order_items.order_id=orders.order_id;で注文を結合します。  

おすすめ

転載: blog.csdn.net/qq_63042830/article/details/135090238