ドキュメント データベースのユースケースを探しているとしたら、私が一番気に入っている非常にシンプルなユースケースは、SQL を使用して他のデータと並べて JSON の山をクエリできる機能であるということに気づきました。特に何もせずに。これは、強力なマルチ モデル インターシステムズ データ プラットフォームによって実現された夢です。ここでは、Rivian R1S が DeezWatts (A Rivian Data Adventure) 用に出力している地理的位置データを視覚化するためのシンプルなノートブックで示しています。
ここでは、JDBC ドキュメント ドライバーを使用した、InterSystems Cloud ドキュメントのからへの取り込みとからの視覚化という 2 段階のアプローチを示します。
まず、リスナーを有効にして、InterSystems Cloud Services Portal 上で小規模な Cloud Document デプロイメントを起動しました。
SSL 証明書をダウンロードし、JDBC 用のドライバーと付属のドキュメント ドライバーも入手しました。
取り込みの場合、ファイル システムから JSON ドキュメントを取得し、リスナーを介してドキュメント データベースにコレクションとして保持する方法を把握したいと思い、そのためにスタンドアロンの Java アプリを作成しました。データをノートブックに保存した後、楽しいことがすべてノートブック内で起こるため、これはより実用的でした。
RivianDocDB.java
package databricks_rivian_irisdocdb; import java.sql.SQLException; import com.intersystems.document.*; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.*; import java.io.IOException; import java.io.InputStream; import java.io.File; import java.io.FileInputStream; import org.apache.commons.io.IOUtils; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; public <span>class RivianDocDb </span>{ <span>public static void main(String[] args) </span>{ String directoryPath = "/home/sween/Desktop/POP2/DEEZWATTS/rivian-iris-docdb/databricks_rivian_irisdocdb/in/json/"; DataSource datasrc = DataSource.createDataSource(); datasrc.setPortNumber(443); datasrc.setServerName("k8s-05868f04-a88b7ecb-5c5e41660d-404345a22ba1370c.elb.us-east-1.amazonaws.com"); datasrc.setDatabaseName("USER"); datasrc.setUser("SQLAdmin"); datasrc.setPassword("REDACTED"); try { datasrc.setConnectionSecurityLevel(10); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("\nCreated datasrc\n"); System.out.println(datasrc); datasrc.preStart(2); System.out.println("\nDataSource size =" + datasrc.getSize()); // creates the collection if it dont exist Collection collectedDocs = Collection.getCollection(datasrc,"deezwatts2"); try (Stream<Path> paths = Files.list(Paths.get(directoryPath))) { paths.filter(Files::isRegularFile) .forEach(path -> { File file = path.toFile(); }); } catch (IOException e) { e.printStackTrace(); } File directory = new File(directoryPath); if (directory.isDirectory()) { File[] files = directory.listFiles(); if (files != null) { for (File file : files) { if (file.isFile()) { try (InputStream is = new FileInputStream("/home/sween/Desktop/POP2/DEEZWATTS/rivian-iris-docdb/databricks_rivian_irisdocdb/in/json/" + file.getName())) { String jsonTxt = IOUtils.toString(is, "UTF-8"); Document doc2 = JSONObject.fromJSONString(jsonTxt); // top level key is whip2 Document doc3 = new JSONObject().put("whip2",doc2); collectedDocs.insert(doc3); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } long size = collectedDocs.size(); System.out.println(Long.toString(size)); System.out.println("\nIngested Documents =" + datasrc.getSize());
上記は JAVA のゴミ箱にかなり近いものですが、機能しました。デプロイメントのコレクション ブラウザーでコレクションを確認できます。
これには Databricks のセットアップが少し必要ですが、楽しい部分として pyspark を使用する価値は十分にあります。
2 つの InterSystems ドライバーをクラスターに追加し、証明書を import_cloudsql_certficiate.sh クラスター初期化スクリプトに配置して、キーストアに追加できるようにしました。
完全を期すため、クラスターでは Databricks 16、Spark 3.5.0、および Scala 2.12 を実行しています
したがって、PySpark ジョブを実行し、ドラッグするデータのサブセット内のどこにウィップが入ったかをプロットするように設定する必要があります。
私たちは、プロットへの直接的なアプローチのために geopandas とジオデータセットを使用しています。
package databricks_rivian_irisdocdb; import java.sql.SQLException; import com.intersystems.document.*; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.*; import java.io.IOException; import java.io.InputStream; import java.io.File; import java.io.FileInputStream; import org.apache.commons.io.IOUtils; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; public <span>class RivianDocDb </span>{ <span>public static void main(String[] args) </span>{ String directoryPath = "/home/sween/Desktop/POP2/DEEZWATTS/rivian-iris-docdb/databricks_rivian_irisdocdb/in/json/"; DataSource datasrc = DataSource.createDataSource(); datasrc.setPortNumber(443); datasrc.setServerName("k8s-05868f04-a88b7ecb-5c5e41660d-404345a22ba1370c.elb.us-east-1.amazonaws.com"); datasrc.setDatabaseName("USER"); datasrc.setUser("SQLAdmin"); datasrc.setPassword("REDACTED"); try { datasrc.setConnectionSecurityLevel(10); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("\nCreated datasrc\n"); System.out.println(datasrc); datasrc.preStart(2); System.out.println("\nDataSource size =" + datasrc.getSize()); // creates the collection if it dont exist Collection collectedDocs = Collection.getCollection(datasrc,"deezwatts2"); try (Stream<Path> paths = Files.list(Paths.get(directoryPath))) { paths.filter(Files::isRegularFile) .forEach(path -> { File file = path.toFile(); }); } catch (IOException e) { e.printStackTrace(); } File directory = new File(directoryPath); if (directory.isDirectory()) { File[] files = directory.listFiles(); if (files != null) { for (File file : files) { if (file.isFile()) { try (InputStream is = new FileInputStream("/home/sween/Desktop/POP2/DEEZWATTS/rivian-iris-docdb/databricks_rivian_irisdocdb/in/json/" + file.getName())) { String jsonTxt = IOUtils.toString(is, "UTF-8"); Document doc2 = JSONObject.fromJSONString(jsonTxt); // top level key is whip2 Document doc3 = new JSONObject().put("whip2",doc2); collectedDocs.insert(doc3); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } long size = collectedDocs.size(); System.out.println(Long.toString(size)); System.out.println("\nIngested Documents =" + datasrc.getSize());
慣れるまで少し時間がかかりますが、JSON パス構文と JSON_TABLE を使用した InterSystems Cloud Document へのクエリを次に示します。
import geopandas as gpd import geodatasets from shapely.geometry import Polygon
json パス @ jsonpath.com を非常に簡単に作成できるサイトをなんとか見つけました。
次に、IRIS Document Database Deployment への接続をセットアップし、それをデータフレームに読み込みます。
dbtablequery = f"(SELECT TOP 1000 lat,longitude FROM JSON_TABLE(deezwatts2 FORMAT COLLECTION, '$' COLUMNS (lat VARCHAR(20) path '$.whip2.data.vehicleState.gnssLocation.latitude', longitude VARCHAR(20) path '$.whip2.data.vehicleState.gnssLocation.longitude' ))) AS temp_table;"
次に、ジオデータセットから利用可能な地図を取得します。sdoh 地図は、米国の一般的な使用に最適です。
# Read data from InterSystems Document Database via query above df = (spark.read.format("jdbc") \ .option("url", "jdbc:IRIS://k8s-05868f04-a88b7ecb-5c5e41660d-404345a22ba1370c.elb.us-east-1.amazonaws.com:443/USER") \ .option("jars", "/Volumes/cloudsql/iris/irisvolume/intersystems-document-1.0.1.jar") \ .option("driver", "com.intersystems.jdbc.IRISDriver") \ .option("dbtable", dbtablequery) \ .option("sql", "SELECT * FROM temp_table;") \ .option("user", "SQLAdmin") \ .option("password", "REDACTED") \ .option("connection security level","10") \ .option("sslConnection","true") \ .load())
ここで、R1S が走行した場所の地理的位置ポイントを含める場所にズームインします。このためには、ミシガン州の境界ボックスが必要です。
このために、Keene の非常に洗練されたツールを使用してジオ フェンス境界ボックスを描画し、座標配列を取得しました。
バウンディングボックスの座標配列を取得したので、それらを Polygon オブジェクトに叩き込む必要があります。
# sdoh map is fantastic with bounding boxes michigan = gpd.read_file(geodatasets.get_path("geoda.us_sdoh")) gdf = gpd.GeoDataFrame( df.toPandas(), geometry=gpd.points_from_xy(df.toPandas()['longitude'].astype(float), df.toPandas()['lat'].astype(float)), crs=michigan.crs #"EPSG:4326" )
さあ、Rivian R1S の軌跡を描いてみましょう!これは約 10,000 件のレコードを対象とします (結果を制限するために上記の先頭のステートメントを使用しました)
polygon = Polygon([ ( -87.286377, 45.9664245 ), ( -81.6503906, 45.8134865 ), ( -82.3864746, 42.1063737 ), ( -84.7814941, 41.3520721 ), ( -87.253418, 42.5045029 ), ( -87.5610352, 45.8823607 ) ])
そして、ここにあります...デトロイト、トラバースシティ、シルバーレイク砂丘、オランダ、ボレット湖、インターラチェン...純粋なミシガン、リビアンスタイル。
以上がIRIS Cloud Document と Databricks を使用した Rivian GeoLocation プロットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。