我们开始在我们的应用程序中使用OrientDB。我们用它来存储许多称为“虚拟树”的“迷你图”和相对元数据。
我们有两个类VirtualTreeNode,分别是Vertex和VirtualTreeMeta,它们存储为Generic类,我们希望使用spark对它们进行一些批处理分析。
用于在Spark中加载数据的代码是:
public void loadData() {
Map<String, String> properties = new TreeMap<>();
properties.put("user", "####");
properties.put("password", "####");
properties.put("url", "jdbc:orient:remote:localhost:2424/trees-repo");
properties.put("spark", "true");
properties.put("dbtable", "VirtualTreeMeta");
SparkSession session = SparkSession.builder()
.master("local[8]")
.appName("Document Attribute Pruner")
.getOrCreate();
SQLContext sc = new SQLContext(session);
Dataset<Row> data = sc.read().format("jdbc").options(properties).load();
data.show();
}
如果我使用dbtable = VirtualTreeMeta,则一切正常,但是当我尝试与VirtualTreeNode连接时,会发生这种情况:
Exception in thread "main" java.lang.NullPointerException
at com.orientechnologies.orient.jdbc.OrientJdbcResultSetMetaData.lambda$isSigned$5(OrientJdbcResultSetMetaData.java:294)
at java.util.Optional.map(Optional.java:215)
at com.orientechnologies.orient.jdbc.OrientJdbcResultSetMetaData.isSigned(OrientJdbcResultSetMetaData.java:294)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.getSchema(JdbcUtils.scala:232)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:64)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:113)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:45)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:330)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:125)
at qProj.collector.treevirt.pruning.VirtualTreePruner.loadData(VirtualTreePruner.java:36)
at qProj.collector.treevirt.pruning.Main.main(Main.java:5)
我们不知道为什么会这样。可以通过与通用类不同的方式来访问顶点类吗?
配置中是否有错误?我们使用的是OrientDB 3.0.6的最新版本,Spark是2.1。