Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用结构化流媒体将拼花文件从HDFS复制到MS SQL Server?_Scala_Apache Spark_Jdbc_Spark Structured Streaming - Fatal编程技术网

Scala 如何使用结构化流媒体将拼花文件从HDFS复制到MS SQL Server?

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

我正在尝试使用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").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
    }
}