【发布时间】:2021-12-04 06:11:26
【问题描述】:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql._
import org.apache.spark.SparkConf
import org.apache.spark.sql.functions.{col, from_json}
import org.apache.spark.sql.types.{IntegerType, StringType, StructType}
import java.time.{ZonedDateTime, ZoneId}
import java.time.format.DateTimeFormatter
object SparkStreamingKafka1 {
def main(args:Array[String]):Unit={
System.setProperty("hadoop.home.dir", "C:\\hadoop\\")
val spark = SparkSession.builder().appName("test").master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("OFF")
import spark.implicits._
val df = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "demo2")
.option("startingOffsets", "earliest") // From starting
.load()
val personStringDF = df.selectExpr("CAST(value AS STRING)")
val schema=new StructType()
.add("stock_name",StringType)
.add("stock_price",IntegerType)
.add("date",StringType)
val personDF = personStringDF.select(from_json(col("value"), schema).as("data"))
.select("data.*")
personDF.createOrReplaceTempView("persontab")
/* spark.sql("""select min(stock_price) as min_stock_price,
max(stock_price) as max_stock_price,avg(stock_price) as avg_stock_price from persontab""")
.writeStream
.format("console")
.outputMode("complete")
.start()
.awaitTermination()*/
spark.sql("""select min(stock_price) as min_stock_price,
max(stock_price) as max_stock_price,avg(stock_price) as avg_stock_price from persontab""")
.writeStream.outputMode("complete").foreachBatch{(batchDF:DataFrame,batchId:Long) =>
println("inside the foreachbatch1")
batchDF.show()
batchDF.write.format("jdbc")
.mode("append").option("url","jdbc:mysql://localhost:3306/gkstorespipelinedb")
//.option("driver","com.mysql.jdbc.driver")
.option("dbtable","max_min_avg")
.option("user","root")
.option("password","root")
.option("header","true")
.save()
println("saved")
}
// .outputMode("complete")
.start()
.awaitTermination()
}
}
我要执行三个查询。一个是我在上面的代码中完成的聚合,并且工作正常。另外两个是 where 子句查询。如何在这里完成这两个查询。是否能够将所有三个查询的结果保存在一个表中,还是我需要保存在不同的表中?请让我知道如何在这两种方式中做到这一点。
【问题讨论】:
-
为什么不能再使用 2 个 spark.sql...writeStream 调用来进行其他查询?
-
@OneCricketeer 尝试以与您建议的方式相同的方式编写 .. 但没有输出。所以在 foreachbatch 中我使用 spark DSL 编写了多个查询。但有些人无法将日期作为字符串传递。
-
您的日期在 JSON 中是什么样的?你的数据库表有什么数据类型?另外,顺便说一句,使用 Spark 而不是 Kafka Connect 的 JDBC 编写器是否有特定的原因?
-
不,没有理由。它就像我公司给的一个 poc 来工作。所以我正在这样做。我的日期格式是 dd-MM-yyyy。
-
表格是使用varchar还是date类型?你能分享你的 mysql 架构吗?
标签: mysql scala apache-spark apache-spark-sql