org.apache.spark.sql.AnalysisException:找不到表和视图

时间:2018-06-01 13:54:19

标签: java apache-spark neo4j

我使用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 sConfsConf开始,我创建了JavaSparkContext jscjsc开始,我创建了SparkContext scsc开始,我创建了SparkSession ssss开始,我创建了Neo4jJavaSparkContext neo4jjjsc

如此直观:

sConf -> jsc -> sc       -> ss 
             -> neo4jjsc 

另请注意

  • 在loadNeo4jDataframe()中,我使用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

1 个答案:

答案 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)。