我正在尝试使用Spark将流数据写入Neo4j,但遇到了一些问题(我对Spark非常陌生)。
我尝试设置字数统计流,并且可以使用示例here中的自定义ForeachWriter将其写入Postgres。所以我认为我了解基本流程。
然后我尝试复制此文件并将数据发送到Neo4j,而不是使用neo4j-spark-connector。我可以使用Zeppelin笔记本here中的示例将数据发送到Neo4j。所以我试图将这段代码传输到ForeachWriter上,但是我遇到了一个问题-sparkContext在ForeachWriter中不可用,从我的阅读中不应该传递它,因为它在驱动程序上运行时foreach代码在执行程序上运行。在这种情况下,任何人都可以提供帮助吗?
Sink.scala:
val spark = SparkSession
.builder()
.appName("Neo4jSparkConnector")
.config("spark.neo4j.bolt.url", "bolt://hdp1:7687")
.config("spark.neo4j.bolt.password", "pw")
.getOrCreate()
import spark.implicits._
val lines = spark.readStream
.format("socket")
.option("host", "localhost")
.option("port", 9999)
.load()
val words = lines.as[String].flatMap(_.split(" "))
val wordCounts = words.groupBy("value").count()
wordCounts.printSchema()
val writer = new Neo4jSink()
import org.apache.spark.sql.streaming.ProcessingTime
val query = wordCounts
.writeStream
.foreach(writer)
.outputMode("append")
.trigger(ProcessingTime("25 seconds"))
.start()
query.awaitTermination()
Neo4jSink.scala:
class Neo4jSink() extends ForeachWriter[Row]{
def open(partitionId: Long, version: Long):Boolean = {
true
}
def process(value: Row): Unit = {
val word = ("Word", Seq("value"))
val word_count = ("WORD_COUNT", Seq.empty)
val count = ("Count", Seq("count"))
Neo4jDataFrame.mergeEdgeList(sparkContext, value, word, word_count, count)
}
def close(errorOrNull:Throwable):Unit = {
}
}