【问题标题】:Use ETL to load CSV data into OrientDB containing a SPATIAL index使用 ETL 将 CSV 数据加载到包含 SPATIAL 索引的 OrientDB
【发布时间】:2016-08-29 18:40:58
【问题描述】:

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

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

提前感谢您的任何建议。

【问题讨论】:

  • 您好,您可以发布整个代码吗?
  • 我认为您还必须指定算法“type”:“SPATIAL”,“algorithm”:“LUCENE”,但我得到了同样的例外。你能在github上打开一个问题吗?

标签: orientdb orientdb2.2 orientdb-etl


【解决方案1】:

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

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

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

我这样做是因为它似乎对我更有效。当我希望 ETL 引擎关闭 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多