如果您一直在尋找文檔資料庫的用例,我意識到我最喜歡的非常簡單的一個是能夠使用sql查詢一堆JSON,與我的其他資料一起沒有真正做太多事情。這是透過強大的多模型 InterSystems 資料平台實現的夢想,並在一個簡單的筆記本中顯示,以視覺化我的 Rivian R1S 為 DeezWatts(Rivian 資料冒險)發出的地理位置資料。
因此,這是兩步驟方法,使用 JDBC 文件驅動程式攝取到並視覺化來自
InterSystems 雲端文件。首先,我在 InterSystems 雲端服務入口網站上啟動了一個小型雲端文件部署,並啟用了偵聽器。
我下載了 ssl 證書,並取得了 JDBC 驅動程式和隨附的文件驅動程式。
對於攝取,我想掌握如何從文件系統中提取 JSON 文件並將其作為集合保存在偵聽器上的文檔資料庫中,為此我編寫了一個獨立的 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 一起工作以獲得有趣的部分是非常值得的。
我將兩個 InterSystems 驅動程式新增至叢集中,並將憑證放入 import_cloudsql_certficiate.sh 叢集初始化腳本中,以便將其新增至金鑰庫中。
所以我們應該設定執行 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 文件資料庫部署的連線並將其讀入資料幀。
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 筆記錄(我使用上面的 top 語句來限制結果)
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 ) ])
我們就有了...底特律、特拉弗斯城、銀湖沙丘、荷蘭、鯔魚湖、因特拉肯...純正的密西根、Rivian 風格。
以上是使用 IRIS Cloud Document 和 Databricks 繪製 Rivian 地理位置圖的詳細內容。更多資訊請關注PHP中文網其他相關文章!