我正在尝试按照此处提到的说明进行操作......
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?
答案 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()
val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:mysql:dbserver")
.option("dbtable", “schema.tablename")
.option("user", "username")
.option("password", "password")
.load()
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)
如果您尝试从jdbc读取数据。使用数据帧API而不是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。
如果您觉得这很有用,请接受此答案。