我正在使用PostGre作为数据库。我想为每个批次捕获一个表数据,并将其转换为实木复合地板文件并存储到s3中。我试图使用spark和readStream的JDBC选项进行连接,如下所示...
val jdbcDF = spark.readStream
.format("jdbc")
.option("url", "jdbc:postgresql://myserver:5432/mydatabase")
.option("dbtable", "database.schema.table")
.option("user", "xxxxx")
.option("password", "xxxxx")
.load()
但是它抛出了不受支持的异常
Exception in thread "main" java.lang.UnsupportedOperationException: Data source jdbc does not support streamed reading
at org.apache.spark.sql.execution.datasources.DataSource.sourceSchema(DataSource.scala:234)
at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo$lzycompute(DataSource.scala:87)
at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo(DataSource.scala:87)
at org.apache.spark.sql.execution.streaming.StreamingRelation$.apply(StreamingRelation.scala:30)
at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:150)
at examples.SparkJDBCStreaming$.delayedEndpoint$examples$SparkJDBCStreaming$1(SparkJDBCStreaming.scala:16)
at examples.SparkJDBCStreaming$delayedInit$body.apply(SparkJDBCStreaming.scala:5)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:392)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
我走对了吗?真的不支持将数据库作为火花流的数据源吗?
AFAIK的另一种实现方法是编写一个kafka生产者,将数据发布到kafka主题中,然后使用Spark Streaming ...
注意:我不想为此使用kafka connect 一些辅助转换。
这是唯一的方法吗?
正确的做法是什么?有这样的例子吗? 请协助!
答案 0 :(得分:1)
Spark结构化的流没有标准的JDBC源,但是您可以编写一个自定义,但是您应该了解,表必须具有唯一的键来跟踪更改。 例如,您可以使用my implementation,不要忘记将必需的JDBC驱动程序添加到依赖项中
答案 1 :(得分:0)