从spark连接到mysql

时间:2016-09-11 14:21:36

标签: apache-spark apache-spark-sql

我正在尝试按照此处提到的说明进行操作......

https://www.percona.com/blog/2016/08/17/apache-spark-makes-slow-mysql-queries-10x-faster/

在这里......

https://www.percona.com/blog/2015/10/07/using-apache-spark-mysql-data-analysis/

我正在使用sparkdocker图片。

docker run -it -p 8088:8088 -p 8042:8042 -p 4040:4040 -h sandbox sequenceiq/spark:1.6.0 bash

cd /usr/local/spark/

./sbin/start-master.sh

./bin/spark-shell --driver-memory 1G --executor-memory 1g --executor-cores 1 --master local

这可以按预期工作:

scala> sc.parallelize(1 to 1000).count()

但这显示错误:

val jdbcDF = spark.read.format("jdbc").options(
  Map("url" ->  "jdbc:mysql://1.2.3.4:3306/test?user=dba&password=dba123",
  "dbtable" -> "ontime.ontime_part",
  "fetchSize" -> "10000",
  "partitionColumn" -> "yeard", "lowerBound" -> "1988", "upperBound" -> "2016", "numPartitions" -> "28"
  )).load()

这是错误:

<console>:25: error: not found: value spark
         val jdbcDF = spark.read.format("jdbc").options(

如何从spark shell中连接到MySQL?

4 个答案:

答案 0 :(得分:1)

使用spark 2.0.x,您可以使用DataFrameReader和DataFrameWriter。 使用SparkSession.read访问DataFrameReader并使用Dataset.write访问DataFrameWriter。

假设使用spark-shell。

阅读示例

val prop=new java.util.Properties()
prop.put("user","username")
prop.put("password","yourpassword")
val url="jdbc:mysql://host:port/db_name"

val df=spark.read.jdbc(url,"table_name",prop) 
df.show()

阅读示例2

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:mysql:dbserver")
  .option("dbtable", “schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load()

来自spark doc

写例子

import org.apache.spark.sql.SaveMode

val prop=new java.util.Properties()
prop.put("user","username")
prop.put("password","yourpassword")
val url="jdbc:mysql://host:port/db_name"
//df is a dataframe contains the data which you want to write.
df.write.mode(SaveMode.Append).jdbc(url,"table_name",prop)

答案 1 :(得分:0)

看起来spark未定义,您应该使用SQLContext连接到驱动程序,如下所示:

import org.apache.spark.sql.SQLContext

val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

val dataframe_mysql = sqlcontext.read.format("jdbc").option("url", "jdbc:mysql://Public_IP:3306/DB_NAME").option("driver", "com.mysql.jdbc.Driver").option("dbtable", "tblage").option("user", "sqluser").option("password", "sqluser").load()

稍后您可以使用sqlcontext用户使用spark(在spark.read等中)

答案 2 :(得分:0)

  • 首先创建spark上下文
  • 确保附加到类路径的jdbc jar文件

如果您尝试从jdbc读取数据。使用数据帧API而不是RDD,因为数据帧具有更好的性能。请参考下面的表现比较图。

DataFrame vs RDD

这是从jdbc

读取的语法
SparkConf conf = new SparkConf().setAppName("app"))
                .setMaster("local[2]")
                .set("spark.serializer",prop.getProperty("spark.serializer"));

JavaSparkContext sc = new JavaSparkContext(conf);
sqlCtx = new SQLContext(sc);

df = sqlCtx.read()
                        .format("jdbc")
                        .option("url", "jdbc:mysql://1.2.3.4:3306/test")
                        .option("driver", "com.mysql.jdbc.Driver")
                        .option("dbtable","dbtable")
                        .option("user", "dbuser")
                        .option("password","dbpwd"))
                        .load();

答案 3 :(得分:0)

对于那些从早期版本迁移到Spark 2.0.0的人来说,这是一个常见问题。 Spark文档不是很好。要解决这个问题,你必须定义一个SparkSession,如下所示:

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark SQL Example")
  .config("spark.some.config.option", "some-value")
  .getOrCreate()

此解决方案隐藏在Spark SQL,数据框和数据集指南located here中。 SparkSession是DataFrame API的新入口点,它包含 SQLContext HiveContext ,并具有一些额外的优势,因此无需再定义其中任何一个。有关这方面的更多信息可以是found here

如果您觉得这很有用,请接受此答案。