首頁 >後端開發 >Python教學 >使用 IRIS Cloud Document 和 Databricks 繪製 Rivian 地理位置圖

使用 IRIS Cloud Document 和 Databricks 繪製 Rivian 地理位置圖

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-01 02:48:17630瀏覽

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

使用 InterSystems Cloud Document 和 Databricks 繪製來自我的 Rivian R1S 的密西根州 gnSSLlocation 資料

如果您一直在尋找文檔資料庫的用例,我意識到我最喜歡的非常簡單的一個是能夠使用sql查詢一堆JSON,與我的其他資料一起沒有真正做太多事情。這是透過強大的多模型 InterSystems 資料平台實現的夢想,並在一個簡單的筆記本中顯示,以視覺化我的 Rivian R1S 為 DeezWatts(Rivian 資料冒險)發出的地理位置資料。

因此,這是兩步驟方法,使用 JDBC 文件驅動程式攝取並視覺化來自

InterSystems 雲端文件。

InterSystems 雲端文件部署

首先,我在 InterSystems 雲端服務入口網站上啟動了一個小型雲端文件部署,並啟用了偵聽器。

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

我下載了 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垃圾箱非常接近,但是有效,我們可以在部署中的集合瀏覽器中看到集合。

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

資料塊

現在這需要一些 Databricks 設置,但與 pyspark 一起工作以獲得有趣的部分是非常值得的。

我將兩個 InterSystems 驅動程式新增至叢集中,並將憑證放入 import_cloudsql_certficiate.sh 叢集初始化腳本中,以便將其新增至金鑰庫中。

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

為了完整起見,叢集運作的是 Databricks 16、Spark 3.5.0 和 Scala 2.12

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

可視化

所以我們應該設定執行 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。

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

接下來我們設定與 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 的一個非常靈活的工具來繪製地理圍欄邊界框,它給了我坐標數組!

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

現在我們有了邊界框的座標數組,我們需要將它們放入 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 風格。

Rivian GeoLocation Plotting with IRIS Cloud Document and Databricks

以上是使用 IRIS Cloud Document 和 Databricks 繪製 Rivian 地理位置圖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn