使用ETL将CSV数据加载到包含SPATIAL索引的OrientDB中

时间:2016-08-29 18:40:59

标签: orientdb orientdb2.2 orientdb-etl

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

我正在使用OrientDB 2.2.8并将most_fields添加到我的$ 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或lucene spatial module

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

我能够使用legacy spatial capabilities加载它。

我整理了一个cheezy数据集,其中包含一些Nazca线geoglyphs的坐标:

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

这对我有用......我确信有更好的方法可以做到,但这很有效。我在这里张贴这个以解决问题。希望有人会觉得这很有用。