我知道我们可以通过以下命令从SparkSQL查询或创建Mysql表。
val data = sqlContext.read.jdbc(urlstring, tablename, properties)
data.write.format("com.databricks.spark.csv").save(result_location)
val dataframe = sqlContext.read.json("users.json")
dataframe.write.jdbc(urlstring, table, properties)
像这样有什么办法可以放下桌子吗?
JDBC
驱动程序尝试基本的DROP
操作:
val DB_URL: String = ???
val USER: String = ???
val PASS: String = ???
def dropTable(tableName: String) = {
import java.sql._;
var conn: Connection = null;
var stmt: Statement = null;
try {
Class.forName("com.mysql.jdbc.Driver");
println("Connecting to a selected database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
println("Connected database successfully...");
println("Deleting table in given database...");
stmt = conn.createStatement();
val sql: String = s"DROP TABLE ${tableName} ";
stmt.executeUpdate(sql);
println(s"Table ${tableName} deleted in given database...");
} catch {
case e: Exception => println("exception caught: " + e);
} finally {
???
}
}
dropTable("test")
您可以使用 Spark 使用JDBCUtils
做到这一点,但这非常简单。
你可以看看写入模式方法
dataframe.write.mode('overwrite').jdbc(urlstring, table, properties)
覆盖模式意味着将数据帧保存到数据源时,如果数据/表已存在,则现有数据应被数据帧的内容覆盖。
来自: https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html#save-modes
此外,如果您不想删除定义,可以放入要截断的属性。
这是一个与 JDBC 编写器相关的选项。启用保存模式时。此选项会导致 Spark 截断现有表,而不是删除并重新创建它。这可以更有效,并防止表元数据(例如,索引)被删除。但是,在某些情况下,例如当新数据具有不同的架构时,它将不起作用。它默认为 false。此选项仅适用于写入。
来自: https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html