首页 / 浏览问题 / 组件GIS / 问题详情
SDXReader读取oracleplus
3EXP 2018年07月18日

你好

   我现在想使用SDXReader.readFromDS读取存放在oracleplus里面的sdx+数据,想请问下如何进行访问,我使用如下方法,一直报错

val dsConnInfo = DSConnectionInfo(DatasourceType.OraclePlus,"10.10.0.249:1521/orcl", "C_JCDL_530000", "", Some("C_JCDL_530000"), Some("xxxx"))
val rdd = SDXReader.readFromDS(sc, dsConnInfo,"HYDA", numSlices = 1, isDriver = false)

报错错信息是

[bdt]: open datasource 10.10.0.249:1521/orcl failed
Exception in thread "main" java.lang.IllegalArgumentException:  dataset is null
    at com.supermap.bdt.io.sdx.SDXFeatureRDD.<init>(SDXFeatureRDD.scala:71)
    at com.supermap.bdt.io.sdx.SDXFeatureRDD$.apply(SDXFeatureRDD.scala:380)
    at com.supermap.bdt.io.sdx.SDXReader$.readFromDS(SDXReader.scala:370)
    at com.bzhcloud.spatial.process.GetData$.main(GetData.scala:55)
    at com.bzhcloud.spatial.process.GetData.main(GetData.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:738)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
 

1个回答

你的报错是提示数据集不存在,检查参数是否都正确,其次将isDriver参数改为true试试,另外连接oracle的方式很多,我是这样连得,你可以试试:

val url = "jdbc:oracle:thin:@localhost:1521:smorcl"
val property = new java.util.Properties
property.put("user", "test")
property.put("password", "supermap")
//自带驱动包
property.put("driver", "oracle.jdbc.driver.OracleDriver")
val info = JDBCConnectionInfo(url, property)
val dtRDD = JDBCReader.read(ss, info, "Park", "SMID", 3, 5, 2)
dtRDD.first().attributes.foreach(println)
println("总数:" + dtRDD.collect().length)
1,520EXP 2018年07月19日

你好,我按照你提供的方法,现在可以连上dataset,但是有新的报错,信息如下

java.lang.IllegalArgumentException: Field "SmX" does not exist.
    at org.apache.spark.sql.types.StructType$$anonfun$fieldIndex$1.apply(StructType.scala:290)
    at org.apache.spark.sql.types.StructType$$anonfun$fieldIndex$1.apply(StructType.scala:290)
    at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
    at scala.collection.AbstractMap.getOrElse(Map.scala:59)

我读取dataset信息配置为

val dtRDD = JDBCReader.read(ss, info, "AANP", "SMID", 3, 5, 2)

在数据库中,是有SmX这个字段的

我以为是要区分大小写,我又把方法改造成

var arr = Array("SMX", "SMY")
val dtRDD = JDBCReader.read(ss, info, dataset, "SMID", 3, 5, 2,fields = Option(arr))

结果还是不行,麻烦你再帮我看看

谢谢!

读取字段的那个参数传入null或none,默认读取所有字段,然后通过featurerdd得到元信息FeatureMetadata,验证是否存在某个字段看看,verifyField(name: String): Boolean。具体使用看看api文档

我用默认读取所有字段,理论上来说底层代码应该会默认获取所有字段和数据吧?我看了下这个dataset的元数据信息,表结构里面字段全是大写,但是在SMFIELDINFO这个表里面是大小写混杂的

现在报错提示说找不到的字段就是大小写混杂的,iobjects底层的逻辑我是控制不到,请问下这个情况有什么好的解决方案呢

字段里没有SMX啊,字段名称都大写吧
哦,抱歉我截图是真对另外一个数据集的,报错是说字段SmGeometry找不到
...