StructruedStreaming 使用foreach落地数据到mysql中 代码示例

	package com.itcast.sql
	
	import java.sql.{Connection, DriverManager, Statement}
	
	import org.apache.spark.sql.{ForeachWriter, Row, SparkSession}
	
	object StructruedForeach {
	
	  def main(args: Array[String]): Unit = {
	
	    val spark = SparkSession.builder()
	      .appName("structrued mysql")
	      .master("local[6]")
	      .getOrCreate()
	
	
	    spark.sparkContext.setLogLevel("error")
	
	    import spark.implicits._
	
	    val source = spark.readStream
	      .format("kafka")
	      .option("kafka.bootstrap.servers", "hadoop100:9092")
	      .option("subscribe", "structrued_streaming_1")
	      .option("startingOffsets", "latest")
	      .load()
	      //.selectExpr("CAST(value to STRING) as value")
	      .selectExpr("CAST(value as STRING) as value")
	      .as[String]
	
	
	    //peter,20,10.2
	    val resultDF = source.map(
	      item => {
	        val words = item.split(",")
	        (words(0).toString, words(1).toInt, words(2).toDouble)
	      }
	    ).as[(String, Int, Double)].toDF("name", "age", "gpa")
	
	    resultDF.writeStream
	      .foreach(new MySqlWriter)
	      .start()
	      .awaitTermination()
	
	
	  }
	
	  class MySqlWriter extends ForeachWriter[Row] {
	
	    var connection:Connection = null;
	    var statement:Statement = null
	
	    override def open(partitionId: Long, version: Long): Boolean = {
	      Class.forName("com.mysql.jdbc.Driver")
	      connection = DriverManager.getConnection("jdbc:mysql://hadoop100:3306/spark_test", "root", "root")
	      statement = connection.createStatement()
	      true
	    }
	
	    override def process(value: Row): Unit = {
	
	      statement.executeUpdate(s"insert into student values(${value.getString(0)} ,${value.getInt(1)},${value.getDouble(2)})")
	    }
	
	    override def close(errorOrNull: Throwable): Unit = {
	      connection.close()
	    }
	
	  }
	
	}
### 回答1: MySQL不支持 `foreach` 语句。要删除数据,可以使用 `DELETE FROM` 语句。例如,如果你想删除数据表 `t1` 的所有行,可以使用如下语句: ``` DELETE FROM t1; ``` 如果你想删除满足某些条件的行,可以使用 `WHERE` 子句。例如,如果你想删除数据表 `t1` `col1` 值为 `val1` 的行,可以使用如下语句: ``` DELETE FROM t1 WHERE col1 = 'val1'; ``` 如果你想遍历数据表并删除满足某些条件的行,可以使用游标。游标是指数据库系统用于遍历结果集的工具。这是一个简单的例子: ``` -- 声明游标 DECLARE cur CURSOR FOR SELECT * FROM t1; -- 声明变量 DECLARE var1 INT; -- 打开游标 OPEN cur; -- 循环遍历游标 my_loop: LOOP -- 从游标获取一行数据 FETCH cur INTO var1; -- 如果没有更多行,退出循环 IF done THEN LEAVE my_loop; END IF; -- 如果 var1 的值符合条件,删除该行 IF var1 = 'val1' THEN DELETE FROM t1 WHERE CURRENT OF cur; END IF; END LOOP my_loop; -- 关闭游标 CLOSE cur; ``` 希望这能帮到你! ### 回答2: 在MySQL,没有直接使用`foreach`来删除数据的方法,但是可以使用循环结构和条件语句实现类似的功能。假设要删除一张名为`user`的表,所有`age`大于等于30的记录。 首先,可以使用`SELECT`语句选取出所有满足条件的记录: ``` SELECT * FROM user WHERE age >= 30; ``` 然后,可以使用循环结构(如`WHILE`或`REPEAT`)遍历选的记录,并使用`DELETE`语句进行删除。以下是使用`WHILE`循环结构的示例: ``` DECLARE done INT DEFAULT FALSE; DECLARE userId INT; DECLARE CURSOR CUR FOR SELECT userId FROM user WHERE age >= 30; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN CUR; read_loop: LOOP FETCH CUR INTO userId; IF done THEN LEAVE read_loop; END IF; DELETE FROM user WHERE userId = userId; END LOOP; CLOSE CUR; ``` 在上述示例,首先声明了一个布尔型变量`done`来表示循环是否已经完成。然后,通过`DECLARE CURSOR`语句声明了一个游标`CUR`,它将根据条件选取出需要删除的记录的`userId`。接着,使用`OPEN CUR`打开游标,并使用`FETCH`语句来逐行获取选的记录的`userId`。在循环体内,使用`DELETE`语句删除对应的记录。当循环结束后,使用`CLOSE CUR`关闭游标。 需要注意的是,使用循环删除大量数据可能对数据库性能造成影响,因此在实际应用应慎重使用。如果需要一次性删除所有满足条件的记录,也可以直接使用`DELETE`语句完成,而无需使用循环。 ``` DELETE FROM user WHERE age >= 30; ``` 以上是一种使用循环结构删除数据的方法,MySQL还有其他的删除数据的方式,具体应视情况而定。 ### 回答3: MySQL无法直接使用foreach语句删除数据,因为MySQL是一种关系型数据库管理系统,其删除数据的操作是通过使用DELETE语句实现的。下面是一个示例: 1. 首先,通过SELECT语句获取要删除的数据集合。 ``` SELECT * FROM table_name WHERE conditions; ``` 2. 将上述查询结果保存到一个临时表,方便后续的操作。 ``` CREATE TEMPORARY TABLE temp_table SELECT * FROM table_name WHERE conditions; ``` 3. 迭代遍历临时表的每一行,并使用DELETE语句删除相应的数据。 ``` SET @id = NULL; REPEAT SELECT MIN(id) INTO @id FROM temp_table; DELETE FROM table_name WHERE id = @id; DELETE FROM temp_table WHERE id = @id; UNTIL @id IS NULL END REPEAT; ``` 4. 最后,可以使用DROP TABLE语句删除临时表。 ``` DROP TABLE temp_table; ``` 需要注意的是,上述示例代码的"table_name"和"conditions"分别表示要删除数据的表名和删除条件,根据实际情况进行替换。此外,以上方法使用了临时表来保存查询结果,以免在删除操作的查询结果会随着删除而改变。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值