2

我有兴趣从一些包含 WGS84 Lat/Long 空间坐标的 CSV 文件中将一些数据加载到 OrientDB 中。

我正在使用 OrientDB 2.2.8 并将lucene 空间模块添加到我的 $ORIENTDB_HOME/lib 目录中。

我正在使用 ETL 将数据加载到数据库中,并且想添加空间索引,但我不确定如何执行此操作。

假设我的 CSV 文件具有以下列:

  • 标签(字符串)
  • 纬度(浮点数)
  • 经度(浮点数)

我在我的 ETL 中试过这个:

"loader": {
    "orientdb": {
        "dbURL": "plocal:myDatabase.orientdb",
        "dbType": "graph",
        "batchCommit": 1000,
        "classes": [ { "name": "vertex", "extends", "V" } ],
        "indexes": [ { "class": "vertex", "fields":["Label:string"], "type":"UNIQUE" },
                     { "class": "Label", "fields":["Latitude:float","Longitude:float"], "type":"SPATIAL" }
                   ]
    }
}

但它不起作用。我收到以下错误消息:

ETL process has problem: com.orientechnologies.orient.core.index.OIndexException: Index with type SPATIAL and algorithm null does not exist.

有没有人研究过通过 ETL 创建空间索引?我在这方面看到的大部分内容都是使用 Java 或通过直接查询

提前感谢您的任何建议。

4

1 回答 1

0

我能够使用旧的空间功能加载它。

我整理了一个俗气的数据集,其中包含一些纳斯卡线地理标志的坐标:

Name,Latitude,Longitude
Hummingbird,-14.692131,-75.148892
Monkey,-14.7067274,-75.1475391
Condor,-14.6983457,-75.1283374
Spider,-14.694363,-75.1235815
Spiral,-14.688309,-75.122757
Hands,-14.694459,-75.113881
Tree,-14.693897,-75.114467
Astronaut,-14.745222,-75.079755
Dog,-14.706401,-75.130788

我使用了一个脚本来创建我的 GeoGlyph 类createVertexGeoGlyph.osql

set echo true
connect PLOCAL:./nazca.orientdb admin admin
CREATE CLASS GeoGlyph EXTENDS V CLUSTERS 1
CREATE PROPERTY GeoGlyph.Name      STRING
CREATE PROPERTY GeoGlyph.Latitude  FLOAT
CREATE PROPERTY GeoGlyph.Longitude FLOAT
CREATE PROPERTY GeoGlyph.Tag       EMBEDDEDSET STRING
CREATE INDEX GeoGlyph.index.Location ON GeoGlyph(Latitude,Longitude) SPATIAL ENGINE LUCENE

我使用加载到我的数据库中

$ console.sh createVertexGeoGlyph.osql

我这样做是因为它似乎对我更有效。当我希望它关闭 CSV 导入时,我在让 ETL 引擎创建定义的属性时遇到了一些困难。有时它想合作并创建我的财产,而其他时候则有麻烦。

因此,获取数据的下一步是为 ETL 流程创建我的 .json 文件。我喜欢制作两个,一个是特定于文件的,另一个是通用文件,因为我经常有跨越多个文件的数据集。

首先,我有一个我的nazca_liens.json文件:

{
    "config": {
        "log": "info",
        "fileDirectory": "./",
        "fileName": "nazca_lines.csv"
    }
}

接下来是commonGeoGlyph.json文件:

{
    "begin": [
               { "let": { "name": "$filePath",  "expression": "$fileDirectory.append($fileName )" } },
             ],
    "config": { "log": "debug" },
    "source": { "file": { "path": "$filePath" } },
    "extractor":
        {
        "csv": { "ignoreEmptyLines": true,
                 "nullValue": "N/A",
                 "separator": ",",
                 "columnsOnFirstLine": true,
                 "dateFormat": "yyyy-MM-dd"
               }
        },
    "transformers": [
            { "vertex": { "class": "GeoGlyph" } },
            { "code":   { "language":"Javascript",
                          "code": "print('>>> Current record: ' + record); record;" }
            }
        ],
    "loader": {
        "orientdb": {
            "dbURL": "plocal:nazca.orientdb",
            "dbType": "graph",
            "batchCommit": 1000,
            "classes": [],
            "indexes": []
        }
    }
}

文件中的内容过多,我将其用作很多内容的模板。在这种情况下,我不必在 ETL 文件本身中创建索引,因为我已经在createVertexGeoGlyph.osql文件中创建了它。

要加载数据,我只使用oetl.sh脚本:

$ oetl.sh commonGeoGlyph.json nazca_lines.json

这对我有用......我确信有更好的方法可以做到这一点,但这有效。我在这里发布这个问题是为了解决这个问题。希望有人会发现这很有用。

于 2016-12-07T20:01:16.310 回答