我知道我们可以通过以下命令从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)
就像那样有办法放弃一张桌子吗?
答案 0 :(得分:5)
您可以使用DROP
驱动程序尝试基本JDBC
操作:
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")
您可以使用JDBCUtils
使用Spark执行此操作,但这非常简单。
答案 1 :(得分:0)
你可以看看写模式的方法
dataframe.write.mode('overwrite').jdbc(urlstring, table, properties)
<块引用>
覆盖模式是指在将DataFrame保存到数据源时,如果数据/表已经存在,现有的数据会被DataFrame的内容覆盖。
来自:https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html#save-modes
此外,如果您不想删除定义,也可以在属性中进行截断。
<块引用>这是一个与 JDBC 编写器相关的选项。启用 SaveMode.Overwrite 时。此选项会导致 Spark 截断现有表,而不是删除并重新创建它。这可以更有效并防止表元数据(例如,索引)被删除。但是,它在某些情况下不起作用,例如当新数据具有不同的架构时。它默认为假。此选项仅适用于写作。
来自:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html