使用SparkSQL删除MySQL表

时间:2016-02-24 10:43:54

标签: mysql scala apache-spark apache-spark-sql

我知道我们可以通过以下命令从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)

就像那样有办法放弃一张桌子吗?

2 个答案:

答案 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