Spark — Java と Scala API によって実現される WordCount ケースの基本操作

実験原理

Spark のコアは RDD です。RDD 上のすべての操作はクラスター上で実行されます。ドライバー プログラムは多くのワーカーを起動します。ワーカーは (分散) ファイル システム内のデータを読み取り、RDD (弾性分散データ セット) に変換し、その後 RDD に変換します。メモリ内でキャッシュされ、計算されます。
ここに画像の説明を挿入
RDD には、アクション (値を返す) と変換 (新しい RDD を返す) という 2 種類の操作があります。
ここに画像の説明を挿入

1. データ表示と事前準備

電子商取引 Web サイトでは、多数のユーザーによる商品の収集データが記録され、buyer_favorite1 という名前のファイルに保存されます。データ形式とデータの内容は次のとおりです。以降の操作を実行する前に、Hadoop サービスと Spark サービスを有効にしてください
ここに画像の説明を挿入
jps コマンドを使用して、プロセスが完全に有効になっているかどうかを確認できます。

2. scalaプロジェクトを作成する

1. 開発環境:eclipse

Scala プラグインがインストールされた Eclipse を開き、spark4 という名前の新しい Scala プロジェクトを作成します。
Spark4 プロジェクトの下に新しいパッケージ名を作成し、my.scala という名前を付けます。scala オブジェクトに ScalaWordCount という名前を付けます。
ここに画像の説明を挿入

2. 実行に必要なjarパッケージをインポートします。

プロジェクトを右クリックし、lib という名前のフォルダーを作成します。
jar パッケージをインポートし、jar パッケージを右クリックして、「ビルド パス」=>「ビルド パスに追加」をクリックします。(私のリソースにアクセスして、spark1.x hadoop2.x をダウンロードできます)

3. Scala ステートメントを記述し、ユーザー収集データで各ユーザーが収集したアイテムの数をカウントします。
package my.scala  
import org.apache.spark.SparkConf  
import org.apache.spark.SparkContext  
object ScalaWordCount {  
    def main(args: Array[String]) {  
	    //创建Spark的配置对象sparkConf,设置Spark程序运行时的配置信息; 
        val conf = new SparkConf()  
        conf.setMaster("local")  .setAppName("scalawordcount")
		//创建SparkContext对象,SparkContext是Spark程序所有功能的唯一入口,无论采用Scala、Java还是Python都必须有一个SparkContext;  
        val sc = new SparkContext(conf)   
        val rdd = sc.textFile("hdfs://localhost:9000/myspark/buyer_favorite1")   //根据具体的数据来源,通过SparkContext来创建RDD;
        //对初始的RDD进行Transformation级别的处理。(首先将每一行的字符串拆分成单个的单词,然后在单词拆分的基础上对每个单词实例计数为1;
        //最后,在每个单词实例计数为1的基础上统计每个单词在文件出现的总次数)。
        rdd.map(line => (line.split("\t")(0), 1))  
           .reduceByKey(_ + _)  
           .collect()  
           .foreach(println)  
        sc.stop()  
    }  
}  

出力結果は制御インターフェースコンソールに表示されます。ここに画像の説明を挿入

3. Java プロジェクトを作成する

プロジェクト名を再度右クリックし、新しいパッケージを作成し、パッケージに my.java という名前を付けます。
パッケージ my.java を右クリックし、新しいクラスを作成し、JavaWordCount という名前を付けます。

1. ユーザー収集データ内の各ユーザーが収集したアイテムの数をカウントする Java コードを作成します。
package my.java;  
import org.apache.spark.SparkConf;  
import org.apache.spark.api.java.JavaPairRDD;  
import org.apache.spark.api.java.JavaRDD;  
import org.apache.spark.api.java.JavaSparkContext;  
import org.apache.spark.api.java.function.FlatMapFunction;  
import org.apache.spark.api.java.function.Function2;  
import org.apache.spark.api.java.function.PairFunction;  
import scala.Tuple2;  
import java.util.Arrays;  
import java.util.List;  
import java.util.regex.Pattern;  
public final class JavaWordCount {  
 private static final Pattern SPACE = Pattern.compile("\t");  
 public static void main(String[] args) throws Exception {  
   SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("JavaWordCount");  
   JavaSparkContext ctx = new JavaSparkContext(sparkConf);  
   JavaRDD<String> lines = ctx.textFile("hdfs://localhost:9000/myspark/buyer_favorite1");  
   JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {  
        @Override  
        public Iterable<String> call(String s) {  
            String word[]=s.split("\t",2);  
            return Arrays.asList(word[0]);  
        }  
    });  
   JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {  
        @Override  
        public Tuple2<String, Integer> call(String s) {  
            return new Tuple2<String, Integer>(s, 1);  
        }  
   });  
   JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {  
        @Override  
        public Integer call(Integer i1, Integer i2) {  
            return i1 + i2;  
            }  
        });  
   List<Tuple2<String, Integer>> output = counts.collect();  
   System.out.println(counts.collect());  
   counts.saveAsTextFile("hdfs://localhost:9000/myspark/out");  
   ctx.stop();  
  }  
}
2. Linux ターミナルで出力結果を表示します。

クラスターが開始されている場合は、次のコマンドを実行して結果を表示します。

hadoop fs -cat /myspark/out/part-00000  
最後に書きます

このことから、Spark プログラムを作成する際の scala 言語の優位性は、短くて簡潔であることがわかります。

おすすめ

転載: blog.csdn.net/weixin_52323239/article/details/131600958