Sparksqlはmysqlデータベースに接続します

全員: 

  いいです!Sparksqlはmysqlデータベースのscalaコードを接続します。しばらく勉強した後、私はピットを踏んでそれを共有しました。

package SparkSql

import java.util.Properties

import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by Administrator on 2017/10/12.
  * 功能:演示Sparksql连接mysql数据库
  *
  */
object MysqlDemo {
  def main(args: Array[String]): Unit = {
   val conf=new SparkConf().setAppName("MysqlDemo")
   val sc=new SparkContext(conf)
   val sqlcontext=new SQLContext(sc)
    val personrdd = sc.parallelize(Array("1 tom", "2 jerry", "3 kitty")).map(_.split(" "))
    //通过StructType(结构类型)直接指定每个字段的schema
    val schema=StructType(
      List(
        StructField("id",IntegerType,true), //true表示允许为空
        StructField("name",StringType,true)
      )
    )
    // 将rdd映射到rowrdd
    val rowrdd=personrdd.map(x=>Row(x(0).toInt,x(1)))
    //将schema应用到rowrdd上
    val persondf=sqlcontext.createDataFrame(rowrdd,schema)
    val prop=new Properties()
    prop.put("user","root")
    prop.put("password","root")
    //将数据追加到mysql中
    persondf.write.mode("append").jdbc("jdbc:mysql://192.168.17.108:3306/mysql","test_a",prop)
    sc.stop()
  }
}

 

それをworkspace-scala.jarに入力し、ディレクトリ/ root / testにアップロードします。ジョブを送信するときに、jarパッケージとドライバーの場所を指定します。

/usr/local/spark/bin/spark-submit \
--class SparkSql.MysqlDemo \
--master spark://192.168.17.108:7077 \
--executor-memory 800m \
--jars /usr/local/mysql/lib/mysql-connector-java-5.1.35-bin.jar \
--driver-class-path /usr/local/mysql/lib/mysql-connector-java-5.1.35-bin.jar \
/root/test/workspace-scala.jar

 

 次のエラーが発生する可能性があります。エラーコードは次のとおりです。mysqlドライバパッケージが登録されていないことを示します。

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 0.0 failed 4 times, most recent failure: Lost task 1.3 in stage 0.0 (TID 6, hadoop): java.lang.IllegalStateException: Did not find registered driver with class com.mysql.jdbc.Driver

解決策:mysql-connector-java-5.1.35-bin.jarをディレクトリ/ usr / local / spark / libに保存します

次のように、spark_env.shファイルを変更し、jarパッケージのパスを追加します。

export SPARK_CLASSPATH=/usr/local/spark/lib/*

注:jarパッケージは/ usr / local / spark / lib /ディレクトリーに配置されます

次に、jarパッケージの場所を指定せずにジョブを送信します

/usr/local/spark/bin/spark-submit \
--class SparkSql.MysqlDemo1 \
--master spark://192.168.17.108:7077 \
--executor-memory 800m \
/root/test/workspace-scala.jar

 

jarパッケージを再実行した後、mysqlにログインしてデータ品質を確認します。問題はありません。

 

小さなゲイン:それが単なるフィールドである場合、コードのコアポイントには次の2つがあります。

1次の変更を加えてrddとStructTypeを作成します。

val personrdd=sc.parallelize(Array("11","12","13"))
    //通过StructType(结构类型)直接指定每个字段的schema
    val schema=StructType(
      List(
        StructField("id",IntegerType,true) //true表示允许为空
      )
    )

2 rddをrowrddにマップします。これは非常に重要です。私はピットを踏みました:
 

 val rowrdd=personrdd.map(x=>Row(x(0).toInt))   这是错误的,虽然不报错,但是实际插入的结果是"49","49","49"
 val rowrdd=personrdd.map(x=>Row(x))  这是正确的。 验证之后,mysql中实际插入的数据就是"11","12","13"

 

おすすめ

転載: blog.csdn.net/zhaoxiangchong/article/details/78380023
おすすめ