Scala 如何使用结构化流媒体将拼花文件从HDFS复制到MS SQL Server?
我正在尝试使用Spark Streaming将HDFS中的拼花文件复制到MS Sql Server。 我正在为MS SQL Server使用JDBC驱动程序。 我的代码是:Scala 如何使用结构化流媒体将拼花文件从HDFS复制到MS SQL Server?,scala,apache-spark,jdbc,spark-structured-streaming,Scala,Apache Spark,Jdbc,Spark Structured Streaming,我正在尝试使用Spark Streaming将HDFS中的拼花文件复制到MS Sql Server。 我正在为MS SQL Server使用JDBC驱动程序。 我的代码是: val spark = SparkSession.builder().master("yarn").appName("StreamAFile").getOrCreate(); val userSchema = new StructType().add("mandt","string").add("lifnr","string
val spark = SparkSession.builder().master("yarn").appName("StreamAFile").getOrCreate();
val userSchema = new StructType().add("mandt","string").add("lifnr","string").add("land1","string").add("name1","string").add("name2","string");
val myDF = spark.readStream.format("parquet").schema(userSchema).load("/parquetfilepath/*");
val query = myDF.writeStream.format("jdbc").option("driver","net.sourceforge.jtds.jdbc.Driver").option("dbtable","mytable").option("user","username").option("password","password").option("checkpointLocation","/homedirectory/").start("jdbc:jtds:sqlserver://SQLServer1:1433;DatabaseName=MyDB");
我得到一个错误:
java.lang.UnsupportedOperationException: Data source jdbc does not support streamed writing
如果以前有人处理过此问题,请提供修复程序。错误显示:
数据源jdbc不支持流式写入
这在结构化流媒体中是不可能的。使用旧的Spark Streaming API可能会获得更好的结果(但我不建议这样做,因为它越来越过时)
你为什么要使用结构化流媒体呢?为什么不编写一个批处理Spark应用程序,即Spark.read
和Spark.write
?这应该是可行的,使用cron可以定期执行
p、 我不认为我会用Spark做这样的工作(双关语)。我认为Oozie或类似产品可能更适合这个用例。恐怕没有分布式处理可以让Spark大放异彩。结构化流媒体的Spark提供了一个
foreach()
函数,您可以使用它自己定义一个JDBCSink()
。这是在结构化流媒体中使用mysql的一个很好的演示。
谢谢你,杰切克。我之所以使用结构化流媒体,是为了能够实时地将数据复制到SQL Server。我预计batch Spark应用程序将按顺序执行,而不是并行执行。结构化流媒体也是如此(它仍然是面向批处理的)。这就是为什么我如此“热衷于”提出一些替代方案。没有魔法
class JDBCSink() extends ForeachWriter[Row] {
val driver = "com.mysql.jdbc.Driver"
var connection:Connection = _
var statement:Statement = _
def open(partitionId: Long,version: Long): Boolean = {
Class.forName(driver)
connection = DriverManager.getConnection("jdbc:mysql://10.88.1.102:3306/aptwebservice", "root", "mysqladmin")
statement = connection.createStatement
true
}
def process(value: Row): Unit = {
statement.executeUpdate("replace into DNSStat(ip,domain,time,count) values("
+ "'" + value.getString(0) + "'" + ","//ip
+ "'" + value.getString(1) + "'" + ","//domain
+ "'" + value.getTimestamp(2) + "'" + "," //time
+ value.getLong(3) //count
+ ")")
}
def close(errorOrNull: Throwable): Unit = {
connection.close
}
}