全員:
いいです!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"