Apache spark Neo4j认为密码就是数据库
我正在尝试集成Spark和Neo4j。我是Neo4j的新手。我有以下短火花应用程序Apache spark Neo4j认为密码就是数据库,apache-spark,neo4j,Apache Spark,Neo4j,我正在尝试集成Spark和Neo4j。我是Neo4j的新手。我有以下短火花应用程序 import com.typesafe.config._ import org.apache.spark.sql.SparkSession import org.neo4j.spark._ object Neo4jStorer { var conf :Config = null def main(args: Array[String]): Unit = { val spark = getSp
import com.typesafe.config._
import org.apache.spark.sql.SparkSession
import org.neo4j.spark._
object Neo4jStorer {
var conf :Config = null
def main(args: Array[String]): Unit = {
val spark = getSparkSession()
val sc = spark.sparkContext
val g = Neo4jGraph.loadGraph(sc, label1="a", relTypes=Seq("rel"), label2 = "b")
val vCount = g.toString
println("Count= " + vCount)
}
def getSparkSession(): SparkSession = {
SparkSession
.builder
.appName("SparkNeo4j")
.config("spark.neo4j.bolt.url", "neo4j://127.0.0.1:7687")
.config("spark.neo4j.bolt.user", "neo4j")
.config("spark.neo4j.bolt.password", "FakePassword")
.getOrCreate()
}
}
我使用Spark 3.0作为此代码的示例。当我运行这个程序时,我得到以下信息
20/10/17 14:36:36 ERROR LoadBalancer: Failed to update routing table for database 'FakePassword'. Current routing table: Ttl 1602963396190, currentTime 1602963396527, routers AddressSet=[], writers AddressSet=[], readers AddressSet=[], database 'FakePassword'.
org.neo4j.driver.exceptions.FatalDiscoveryException: Unable to get a routing table for database 'FakePassword' because this database does not exist
如果我更改密码,我会得到一个身份验证错误,我再次看到错误的密码显示为数据库。我创建了一个名为FakePassword的数据库,但仍然出现了相同的错误。为什么会发生这种情况?我如何修复它
另外,当我尝试获取g.vertices.count(如下面的示例所示)时,我得到了一个编译错误。通过这段代码,我能够将数据帧中的数据获取到Neo4j中,这正是我真正想要做的。这似乎不是理想的解决方案,因为它使用foreach。我愿意改进
import com.typesafe.config._
import org.apache.spark.sql.SparkSession
import org.neo4j.driver.{AuthTokens, GraphDatabase, Session}
import org.neo4j.spark._
object StackoverflowAnswer {
def main(args: Array[String]): Unit = {
val spark = getSparkSession()
val sc = spark.sparkContext
import spark.implicits._
val df = sc.parallelize(List(1, 2, 3)).toDF
df.foreach(
row => {
val query = "CREATE (n:NumLable {num: " + row.get(0).toString +"})"
Neo4jSess.session.run(query)
()
}
)
}
def getSparkSession(): SparkSession = {
SparkSession
.builder
.appName("SparkNeo4j")
.getOrCreate()
}
}
object Neo4jSess {
/**
* Store a Neo4j session in a object so that it can be used by Spark
*/
var conf :Config = null
this.conf = ConfigFactory.load().getConfig("DeltaStorer")
val neo4jUrl: String = "bolt://127.0.0.1:7687"
val neo4jUser: String = "neo4j"
val neo4jPassword: String = "FakePassword"
val driver = GraphDatabase.driver(neo4jUrl, AuthTokens.basic(neo4jUser, neo4jPassword))
val session: Session = driver.session()
}
有了这段代码,我能够将数据帧中的数据导入Neo4j,这正是我真正想要做的。这似乎不是理想的解决方案,因为它使用foreach。我愿意改进
import com.typesafe.config._
import org.apache.spark.sql.SparkSession
import org.neo4j.driver.{AuthTokens, GraphDatabase, Session}
import org.neo4j.spark._
object StackoverflowAnswer {
def main(args: Array[String]): Unit = {
val spark = getSparkSession()
val sc = spark.sparkContext
import spark.implicits._
val df = sc.parallelize(List(1, 2, 3)).toDF
df.foreach(
row => {
val query = "CREATE (n:NumLable {num: " + row.get(0).toString +"})"
Neo4jSess.session.run(query)
()
}
)
}
def getSparkSession(): SparkSession = {
SparkSession
.builder
.appName("SparkNeo4j")
.getOrCreate()
}
}
object Neo4jSess {
/**
* Store a Neo4j session in a object so that it can be used by Spark
*/
var conf :Config = null
this.conf = ConfigFactory.load().getConfig("DeltaStorer")
val neo4jUrl: String = "bolt://127.0.0.1:7687"
val neo4jUser: String = "neo4j"
val neo4jPassword: String = "FakePassword"
val driver = GraphDatabase.driver(neo4jUrl, AuthTokens.basic(neo4jUser, neo4jPassword))
val session: Session = driver.session()
}
请尝试更新spark-defaults.conf:
spark.jars.packages neo4j-contrib:neo4j-spark-connector:2.4.5-M2
spark.neo4j.url bolt://XX.XXX.X.XXX:7687
spark.neo4j.user neo4j
spark.neo4j.password test
请尝试更新spark-defaults.conf:
spark.jars.packages neo4j-contrib:neo4j-spark-connector:2.4.5-M2
spark.neo4j.url bolt://XX.XXX.X.XXX:7687
spark.neo4j.user neo4j
spark.neo4j.password test
neo4j螺栓url以
bolt://...
。你能纠正一下并检查一下吗?另外,由于您试图在本地运行它,您可以指定.builder().master(“本地”)
将URL连接到本地。更改为bolt并使用.builder().master(“本地”)无效。我找到了另一个解决办法。我把它包括在下面。它可能不适用于所有遇到我的问题的人,我对改进持开放态度bolt://...。你能纠正一下并检查一下吗?另外,由于您试图在本地运行它,您可以指定.builder().master(“本地”)
将URL连接到本地。更改为bolt并使用.builder().master(“本地”)无效。我找到了另一个解决办法。我把它包括在下面。这可能不适用于所有有我问题的人,我愿意改进。