、JDBCデータソースのケース
1.概要
スパークSQLは、JDBCは中(MySQLのような)リレーショナルデータベースからデータを読み取るサポートしています。データがまだデータフレームで表現されて読んで、あなたは便利処理し、様々なオペレータスパークコアを提供するために使用することができます。 ここでは親指のルールは、実際には、データ処理スパークSQL JDBCは非常に便利です、です。たとえば、MySQLデータベース事業は、例えば10万人が、そして、あなたが今のプログラム記述する必要がある、多くのデータが存在する いくつかの複雑なビジネスロジック処理のペアにダーティデータは、さらに使用するために複雑伴うことを関連プロセスを実行するためにハイブで繰り返しSQLクエリデータをスパーク。 この場合は、その後、MySQLでデータをロードするためにJDBCスパークSQLデータソースを使用して、その後、事業者の様々な治療、それが最良の選択です。スパークは、分散コンピューティングフレームワークであるため、千万データのために処理を分散しなければなりません。 あなたが手でJavaプログラムを書く場合は、その後、申し訳ありませんが、あなただけの実行Javaプログラムを終えることができましたバッチ、再処理最初の処理20000、20000、対処することができ、すでに次の数日の事ですA。 Java版の 地図 <文字列、文字列>オプション= 新しい新しい HashMapの<文字列、文字列> (); options.put( "URL"、 "JDBC:MySQLの:// spark1:3306 / TESTDB" ); options.put( "DBTABLE" 、 "学生" ); DATAFRAME jdbcDF。= SqlContext.read()フォーマット( "JDBC" 。)オプション(オプション).LOAD(); Scalaのバージョン ヴァルjdbcDF = sqlContext.read.format( "JDBC" ).OPTIONS( 地図( "URL" - >「JDBC 3306 / TESTDB ":: MySQLの:// spark1 、 学生" - "DBTABLE"> " 。))負荷() :ケース学生情報のクエリが80個の以上のポイントを獲得
#承認テーブルの権限 TESTDB上のすべてを付与します。 spark1「「@」」に* オプション付与と、 フラッシュの特権を。
図2に示すように、データを準備
MySQLの> データベースTESTDBを作成します。 mysqlの > TESTDBを使用します。 mysqlの >テーブルstudent_infos(名前はvarchar(20作成)、年齢の整数)を、 MySQLの >表student_scoresを作成する(名前はvarchar(20 )、整数スコア)。 MySQLの >( 'ジャック'、19、(17、 '結婚')、student_infos値( 'レオ'、18)に挿入)。 MySQLの >( 'ジャック'、60、(99、 '結婚')、student_scores値( 'レオ'、88)に挿入)。 mysqlの >テーブルgood_student_infos(名前はvarchar(20)、年齢の整数、スコアの整数)を作成します。
3、Javaのケース実現
パッケージcn.spark.study.sql。 インポートのjava.sql.Connection; インポートのjava.sql.DriverManager。 輸入java.sql.Statementの。 輸入はjava.util.ArrayList; 輸入java.util.HashMapを; 輸入はjava.util.List; 輸入java.util.Map; 輸入org.apache.spark.SparkConf。 輸入org.apache.spark.api.java.JavaPairRDD; 輸入org.apache.spark.api.java.JavaRDD; 輸入org.apache.spark.api.java.JavaSparkContext; 輸入org.apache.spark.api.java.function.Function。 輸入org.apache.spark.api.java.function.PairFunction。 輸入org.apache.spark.api.java.function.VoidFunction。 輸入org.apache.spark.sql.DataFrame。 輸入org.apache.spark.sql.Row。 輸入org.apache.spark.sql.RowFactory; 輸入org.apache.spark.sql.SQLContext; 輸入org.apache.spark.sql.types.DataTypes。 輸入org.apache.spark.sql.types.StructField; 輸入org.apache.spark.sql.types.StructType。 輸入scala.Tuple2。 / ** * JDBC数据源 * @authorの管理者 * * / パブリック クラスJDBCDataSource { 公共の 静的な 無効メイン(文字列[]引数){ SparkConf CONF = 新しい新しいSparkConf() .setAppName( "JdbcDataSource" ); JavaSparkContextのSC = 新しい新しいJavaSparkContext(CONF); SqlContext SqlContext = 新しい新しいSqlContext(SC); // 要約 // JDBCデータソース // 最初、リードの方法SQLContext系列によって、データがデータフレームのMySQLとしてロードされる //は、操作スパークコアに設けられた各種の演算子を使用して、RDDデータフレームに変換することができる // 最終データ結果を得ることができますforeachの()オペレータによって、書き込みのmysql、HBaseの、DB /キャッシュなどのRedisのはで // 、それぞれ2つのテーブル内のデータは、MySQLのデータフレームとしてロード 地図<文字列、文字列>オプション= 新しい HashMapの<文字列、文字列> (); options.put( "URL"、 "JDBCます。mysql:// spark1:3306 / TESTDB" ); options.put( "DBTABLE"、 "student_infos" ); データフレームstudentInfosDF = sqlContext.read()フォーマット( "JDBC" ) .OPTIONS(オプション).LOAD(); options.put( "DBTABLE"、 "student_scores" ); データフレームstudentScoresDF = sqlContext.read()フォーマット( "JDBC" ) .OPTIONS(オプション).LOAD(); // 将两个DATAFRAME转换为JavaPairRDD、执行参加操作 JavaPairRDD <文字列、Tuple2 <整数、整数>> studentsRDD = 。studentInfosDF.javaRDD()mapToPair( 新しい PairFunction <行、列、整数> (){ プライベート 静的 最終 長いのserialVersionUID = 1L ; @Override 公共 Tuple2 <文字列、整数>コール(行行)がスロー例外{ 返す 新しい Tuple2 <文字列、整数>(row.getString(0 )、 Integer.valueOf(String.valueOf(row.get( 1 )))); } }) .join(studentScoresDF.javaRDD()mapToPair( 新しい PairFunction <行、列、整数> (){ プライベート 静的 最終 長いのserialVersionUID = 1L ; @Override 公共 Tuple2 <文字列、整数>コール(行行)スロー{例外 戻り 新しい Tuple2 <文字列、整数>(String.valueOf(row.get(0 ))、 Integer.valueOf(String.valueOf(row.get( 1 )))); } }))。 //将JavaPairRDD转换为JavaRDDの<row> JavaRDDの<row> studentRowsRDD = studentsRDD.map( 新しい機能<Tuple2 <文字列、Tuple2 <整数、整数>>、ROW> (){ プライベート 静的 最終 長いのserialVersionUID = 1L ; @Override 公共行コール( Tuple2 <文字列、Tuple2 <整数、整数>> タプル) スロー{例外を 返すRowFactory.create(tuple._1、tuple._2._1、tuple._2._2を); } })。 // 数据的过滤出分数大于80分 JavaRDDの<row> filteredStudentRowsRDD = studentRowsRDD.filter( 新しい機能<行、ブール> (){ プライベート 静的 最終 長いのserialVersionUID = 1L ; @Override パブリックブールコール(行行)がスロー例外{ 場合(row.getInt(2)> 80 ){ 戻り 真; } 戻り 偽; } })。 // 转换为DATAFRAME 一覧<StructField> structFields =新しいのArrayList <StructField> (); structFields.add(DataTypes.createStructField( "名前"、DataTypes.StringType、真)); structFields.add(DataTypes.createStructField( "年齢"、DataTypes.IntegerType、真)); structFields.add(DataTypes.createStructField( "スコア"、DataTypes.IntegerType、真)); StructType structType = DataTypes.createStructType(structFields)。 データフレームstudentsDF = sqlContext.createDataFrame(filteredStudentRowsRDD、structType)。 行[]行 = studentsDF.collect()。 にとって(行の行:列){ System.out.printlnは(行); } //はテーブル内のデータフレームをMySQLへデータを保存する // このアプローチは、企業内の非常に一般的であり、可能な、MySQLを挿入することが可能です挿入HBaseの、Redisのキャッシュが挿入されてもよい のforeach()(studentsDF.javaRDDを。新しい新規 VoidFunction <ROW> (){ プライベート 静的 最終的な ロングのserialVersionUID = 1L ; @Override 公共 ボイドコール(行の行)がスロー例外{ 文字列のSQLを = "good_student_infos値(INSERT INTO" + " '" + String.valueOf(row.getString(0))+ "'、" + Integer.valueOf(String.valueOf(row.get(1)))+ "" conn.createStatement()。 + Integer.valueOf(String.valueOf(row.get(2)))+ ")" 。 Class.forNameの( "はcom.mysql.jdbc.Driver" ); 接続でCONN = nullを。 ステートメントstmtは = nullを。 試す{ CONN = (たDriverManager.getConnection 、 ""、 "" ":MySQLの:// spark1 3306 / TESTDB JDBC" )。 STMT =(例外e){ stmt.executeUpdate(SQL)。 } キャッチ )(e.printStackTraceします。 } 最後に{ 場合(!STMT = NULL ){ stmt.close()。 } もし(!connの= NULL ){ はconn.close(); } } } })。 sc.close(); } }