我使用neo4j-spark connector将neo4j数据提取到spark数据帧中。我能够成功获取它,因为我能够显示数据帧。然后我用createOrReplaceTempView()方法注册数据帧。然后我尝试在它上面运行spark sql,但它提供异常说法
org.apache.spark.sql.AnalysisException: Table or view not found: neo4jtable;
这就是我的整个代码的样子:
import java.text.ParseException;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.neo4j.spark.Neo4JavaSparkContext;
import org.neo4j.spark.Neo4j;
import scala.collection.immutable.HashMap;
public class Neo4jDF {
private static Neo4JavaSparkContext neo4jjsc;
private static SparkConf sConf;
private static JavaSparkContext jsc;
private static SparkContext sc;
private static SparkSession ss;
private static Dataset<Row> neo4jdf;
static String neo4jip = "ll.mm.nn.oo";
public static void main(String[] args) throws AnalysisException, ParseException
{
setSparkConf();
setJavaSparkContext();
setNeo4jJavaSparkContext();
setSparkContext();
setSparkSession();
neo4jdf = loadNeo4jDataframe();
neo4jdf.createOrReplaceTempView("neo4jtable");
neo4jdf.show(false); //this prints correctly
Dataset<Row> neo4jdfsqled = ss.sql("SELECT * from neo4jtable");
neo4jdfsqled.show(false); //this throws exception
}
private static Dataset<Row> loadNeo4jDataframe(String pAutosysBoxCaption)
{
Neo4j neo4j = new Neo4j(jsc.sc());
HashMap<String, Object> a = new HashMap<String, Object>();
Dataset<Row> rdd = neo4j.cypher("cypher query deleted for irrelevance", a).loadDataFrame();
return rdd;
}
private static void setSparkConf()
{
sConf = new SparkConf().setAppName("GetNeo4jToRddDemo");
sConf.set("spark.neo4j.bolt.url", "bolt://" + neo4jip + ":7687");
sConf.set("spark.neo4j.bolt.user", "neo4j");
sConf.set("spark.neo4j.bolt.password", "admin");
sConf.setMaster("local");
sConf.set("spark.testing.memory", "471859200");
sConf.set("spark.sql.warehouse.dir", "file:///D:/Mahesh/workspaces/spark-warehouse");
}
private static void setJavaSparkContext()
{
jsc = new JavaSparkContext(sConf);
}
private static void setSparkContext()
{
sc = JavaSparkContext.toSparkContext(jsc);
}
private static void setSparkSession()
{
ss = new SparkSession(sc);
}
private static void setNeo4jJavaSparkContext()
{
neo4jjsc = Neo4JavaSparkContext.neo4jContext(jsc);
}
}
我觉得问题可能在于如何创建所有spark环境变量。
我首先创建了SparkConf sConf
从sConf
开始,我创建了JavaSparkContext jsc
从jsc
开始,我创建了SparkContext sc
从sc
开始,我创建了SparkSession ss
从ss
开始,我创建了Neo4jJavaSparkContext neo4jjjsc
。
如此直观:
sConf -> jsc -> sc -> ss
-> neo4jjsc
另请注意
sc
实例化实例Neo4j neo4j
,然后用于获取neo4j数据。Neo4j
实例获取数据。 neo4jjjsc
从未使用过,但我保留了它作为问题的暗示。鉴于所有这些观点和观察结果,请告诉我为什么我找不到表格的例外情况?我一定是想念一些愚蠢的事。 :\
更新
尝试设置ss
(在使用neo4j的SparkContext获取数据之后),如下所示:
private static void setSparkSession(SparkContext sc)
{
ss = new SparkSession(sc);
}
private static Dataset<Row> loadNeo4jDataframe(String pAutosysBoxCaption)
{
Neo4j neo4j = new Neo4j(sc);
Dataset<Row> rdd = neo4j.cypher("deleted cypher for irrelevance", a).loadDataFrame();
//initalizing ss after data is fetched using SparkContext of neo4j
setSparkSession(neo4j.sc());
return rdd;
}
更新2
从评论中,我们意识到neo4j
使用提供给它的spark context sc
实例创建了自己的spark会话。我无法访问那个火花会议。那么,我应该如何添加/注册在其他一些火花会话中创建的任意数据帧(此处为neo4jdf
)(这里由neo4j.cypher
创建的spark会话)到我的火花会话ss
?
答案 0 :(得分:0)
根据症状,我们可以推断两段代码使用不同的template<typename V, typename E>
void tGraph<V, E>::PostOrderSearch(const tGraph& g, const VertexType& u, std::set<VertexType>& visited, std::vector<VertexType>& result)
{
std::vector<std::pair<VertexType,bool> > stack;
stack.push_back(std::pair<VertexType, bool>(u,false));
for(;;) {
if (stack.empty()) return; // Done.
std::pair<VertexType, bool> item=stack.back();
stack.pop_back();
VertexType u=item.first;
if (item.second) {
// Post-visit
result.push_back(u);
}
else if (visited.find(u)==visited.end()) {
// Add in reverse order, due to stack
visited.insert(u);
EdgeSet edgesOut = g.outgoingEdgesOf(u);
stack.push_back(std::pair<VertexType, bool>(u,true));
for(typename EdgeSet::const_reverse_iterator iter = edgesOut.rbegin(); iter != edgesOut.rend(); iter++)
{
stack.push_back(std::pair<VertexType,bool>(iter->second.second,false));
}
}
}
/ SparkSession
。假设Neo4j连接器没有任何异常,您应该可以通过更改来解决此问题:
SQLContext
或在致电private static void setSparkSession()
{
ss = SparkSession().builder.getOrCreate();
}
之前初始化SparkSession
。
如果这些不起作用,您可以切换到使用setNeo4jJavaSparkContext
。
重要强>:
一般情况下,我建议使用构建器模式初始化单个createGlobalTempView
,并在必要时从中导出其他上下文(SparkSession
)。