19.11. 文件系统数据存储示例¶
在这个简单的例子中,我们将把一个小的CSV摄取到一个本地文件系统数据存储中,该数据存储由每日Z2-2位方案分区。首先,从解压geomesa-fs发行版开始。在这个发行版中,您会发现一个Examples文件夹,其中包含一个我们将摄取的示例CSV文件。首先设置您要使用的版本:
$ export TAG="4.0.2" $ export VERSION="2.12-${TAG}" # note: 2.12 is the Scala build version
然后下载并解压缩二进制发行版:
# download and unpackage the most recent distribution:
$ wget "https://github.com/locationtech/geomesa/releases/download/geomesa-${TAG}/geomesa-fs_${VERSION}-bin.tar.gz"
$ tar xvf geomesa-fs_${VERSION}-bin.tar.gz
$ cd geomesa-fs_${VERSION}
$ cat examples/ingest/csv/example.csv
输出应如下所示:
ID,Name,Age,LastSeen,Friends,Lon,Lat,Vis
23623,Harry,20,2015-05-06,"Will, Mark, Suzan","patronus->10,expelliarmus->9",-100.236523,23,user
26236,Hermione,25,2015-06-07,"Edward, Bill, Harry","accio->10",40.232,-53.2356,user
3233,Severus,30,2015-10-23,"Tom, Riddle, Voldemort","potions->10",3,-62.23,user&admin
如您所见,文件中有3条记录。对于此示例文件,GeoMesa附带了预安装的SimpleFeatureType和转换器,可在 conf/application.conf
文件。正在运行 bin/geomesa-fs env
将表明存在一个 example-csv
类型和转换器与许多其他类型一起安装,包括Twitter、GDELT、OSM等:
$ bin/geomesa-fs env
输出应如下所示:
Simple Feature Types:
example-avro
example-csv
example-csv-complex
...
Simple Feature Type Converters:
example-avro-header
example-avro-no-header
example-csv
...
在本例中,我们将把这三行存储到一个本地文件系统中。请注意,这些记录都是在不同的日期:
2015-05-06
2015-06-07
2015-10-23
几何图形分为世界的两个象限。第一条记录位于左上象限,第二条和第三条记录位于右下象限::
Lon Lat
-100.236523 23
40.232 -53.2356
3 -62.23
现在让我们来摄取。
$ bin/geomesa-fs ingest -p /tmp/dstest -e parquet -s example-csv -C example-csv \
--partition-scheme daily,z2-2bit examples/ingest/csv/example.csv
输出应如下所示:
INFO Creating schema example-csv
INFO Running ingestion in local mode
INFO Ingesting 1 file with 1 thread
[============================================================] 100% complete 3 ingested 0 failed in 00:00:01
INFO Local ingestion complete in 00:00:01
INFO Ingested 3 features with no failures.
我们可以通过运行导出来验证我们的接收:
$ bin/geomesa-fs export -p /tmp/dstest -f example-csv
输出应如下所示:
id,fid:Integer:index=false,name:String:index=true,age:Integer:index=false,lastseen:Date:default=true:index=false,*geom:Point:srid=4326
26236,26236,Hermione,25,2015-06-07T00:00:00.000Z,POINT (40.232 -53.2356)
3233,3233,Severus,30,2015-10-23T00:00:00.000Z,POINT (3 -62.23)
23623,23623,Harry,20,2015-05-06T00:00:00.000Z,POINT (-100.236523 23)
INFO Feature export complete to standard out in 1676ms for 3 features
现在,让我们检查文件系统:
$ find /tmp/dstest | sort
输出应如下所示:
/tmp/dstest/
/tmp/dstest/example-csv
/tmp/dstest/example-csv/2015
/tmp/dstest/example-csv/2015/05
/tmp/dstest/example-csv/2015/05/06
/tmp/dstest/example-csv/2015/05/06/2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet
/tmp/dstest/example-csv/2015/05/06/.2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet.crc
/tmp/dstest/example-csv/2015/06
/tmp/dstest/example-csv/2015/06/07
/tmp/dstest/example-csv/2015/06/07/1_Wcc082b9cf9bc4965b4cbf64741fee5b6.parquet
/tmp/dstest/example-csv/2015/06/07/.1_Wcc082b9cf9bc4965b4cbf64741fee5b6.parquet.crc
/tmp/dstest/example-csv/2015/10
/tmp/dstest/example-csv/2015/10/23
/tmp/dstest/example-csv/2015/10/23/1_W741f2151a4ed4eec97461a174a8588b7.parquet
/tmp/dstest/example-csv/2015/10/23/.1_W741f2151a4ed4eec97461a174a8588b7.parquet.crc
/tmp/dstest/example-csv/metadata
/tmp/dstest/example-csv/metadata/storage.json
/tmp/dstest/example-csv/metadata/.storage.json.crc
/tmp/dstest/example-csv/metadata/update-2015-05-06-2-12240906-4171-4ab0-acfe-d2ce9c5fff76.json
/tmp/dstest/example-csv/metadata/.update-2015-05-06-2-12240906-4171-4ab0-acfe-d2ce9c5fff76.json.crc
/tmp/dstest/example-csv/metadata/update-2015-06-07-1-ecd68700-88e3-4f04-9438-84b6ab935907.json
/tmp/dstest/example-csv/metadata/.update-2015-06-07-1-ecd68700-88e3-4f04-9438-84b6ab935907.json.crc
/tmp/dstest/example-csv/metadata/update-2015-10-23-1-667f27a7-4f64-472a-80ed-82e8f1e65575.json
/tmp/dstest/example-csv/metadata/.update-2015-10-23-1-667f27a7-4f64-472a-80ed-82e8f1e65575.json.crc
请注意,我们有一个基于我们的 daily,z2-2bit
计划。请注意,第一个地块文件路径由日期路径组成 2016/05/06
然后是Z2坐标 2
,它是文件名的一部分::
/tmp/dstest/example-csv/2015/05/06/2/2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet
拼图文件名的其余部分是UUID,它允许多个线程同时写入不同的文件,而不会发生冲突。如果我们摄取额外的数据,将在该分区下创建另一个文件,并且GeoMesa将在查询时扫描这两个文件。
每个新文件(或文件删除)将创建一个单独的元数据文件,其中包含有关该文件的详细信息:
$ cat /tmp/dstest/example-csv/metadata/update-2015-05-06-629788a4-6a70-4009-ae20-c45602a88483.json
输出应如下所示:
{
"action" : "Add",
"count" : 1,
"envelope" : {
"xmax" : -100.2365,
"xmin" : -100.2365,
"ymax" : 23.0,
"ymin" : 23.0
},
"files" : [
"2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet"
],
"name" : "2015/05/06/2",
"timestamp" : 1538148168948
}