ترسیم موقعیت جغرافیایی Rivian با سند ابری IRIS و بریک های داده

ترسیم داده های gnSSLocation از Rivian R1S من در سراسر میشیگان با InterSystems Cloud Document و Databricks
اگر به دنبال یک مورد استفاده برای یک پایگاه داده اسناد بودید، به این نتیجه رسیدم که مورد علاقه من ساده است. توانایی پرس و جو کردن انبوهی از JSON، درست در کنار سایر داده های من با sql بدون اینکه واقعاً کار زیادی انجام دهید. این رویایی است که از پلتفرم داده قدرتمند چند مدل InterSystems تحقق یافته است و در اینجا در یک نوت بوک ساده برای تجسم داده های موقعیت جغرافیایی من نشان داده شده است که Rivian R1S من برای DeezWatts (ماجراجویی داده های ریویان) منتشر می کند.
بنابراین در اینجا رویکرد 2 مرحله ای، بلعیدن است به و تجسم از InterSystems Cloud Document، با استفاده از درایور سند JDBC.
استقرار اسناد ابری InterSystems
برای شروع، من یک برنامه کوچک Cloud Document را در پورتال InterSystems Cloud Services با یک شنونده فعال راه اندازی کردم.
گواهینامه ssl را دانلود کردم و درایورهای JDBC و درایور سند همراه را نیز گرفتم.
بلع
برای جذب، میخواستم نحوه برداشتن یک سند JSON را از سیستم فایل و حفظ آن به عنوان مجموعهای در پایگاه داده سند روی شنونده، به دست بیاورم، برای این کار یک برنامه جاوا مستقل نوشتم. این مفیدتر بود زیرا همه چیز سرگرم کننده در نوت بوک بعد از قرار گرفتن داده ها در آنجا اتفاق می افتاد.
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 class RivianDocDb {
public static void main(String[] args) {
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) {
e.printStackTrace();
}
System.out.println("\nCreated datasrc\n");
System.out.println(datasrc);
datasrc.preStart(2);
System.out.println("\nDataSource size =" + datasrc.getSize());
Collection collectedDocs =
Collection.getCollection(datasrc,"deezwatts2");
try (Stream 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);
Document doc3 = new JSONObject().put("whip2",doc2);
collectedDocs.insert(doc3);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
long size = collectedDocs.size();
System.out.println(Long.toString(size));
System.out.println("\nIngested Documents =" + datasrc.getSize());
موارد فوق کاملاً به سطل زباله JAVA نزدیک است، اما کار می کند، ما می توانیم مجموعه را در مرورگر مجموعه در استقرار مشاهده کنیم.
Databricks
اکنون این کار کمی به تنظیمات Databricks نیاز دارد، اما ارزش آن را دارد که با pyspark برای بخش سرگرم کننده کار کنید.
من دو درایور InterSystems را به کلاستر اضافه کردم و گواهی را در اسکریپت init کلاستر import_cloudsql_certficiate.sh قرار دادم تا به فروشگاه کلید اضافه شود.
برای کامل بودن، خوشه از Databricks 16، Spark 3.5.0 و Scala 2.12 استفاده می کند.
تجسم
بنابراین باید تنظیم کنیم که یک کار PySpark را اجرا کنیم و جایی که whip من در زیرمجموعه data Ill drag in قرار داشته است را رسم کنیم.
ما از geopandas و geodatasets برای یک رویکرد مستقیم برای ترسیم استفاده می کنیم.
import geopandas as gpd
import geodatasets
from shapely.geometry import Polygon
در حال حاضر، کمی طول می کشد تا به آن عادت کنید، اما در اینجا پرس و جو برای InterSystems Cloud Document با استفاده از نحو مسیرهای JSON و JSON_TABLE است.
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;"
من موفق شدم سایتی را پیدا کنم که ایجاد مسیر json @ jsonpath.com را ساده کرده است.
سپس اتصال را به پایگاه داده IRIS Document Deployment تنظیم می کنیم و آن را در یک دیتافریم می خوانیم.
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())
در مرحله بعد یک نقشه در دسترس را از مجموعه دادههای جغرافیایی میگیریم، نقشه sdoh برای استفاده عمومی در ایالات متحده عالی است.
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
)
اکنون بخش جالب، ما میخواهیم روی جایی که میخواهیم نقاط جغرافیایی مکانی را که R1S در آن حرکت کرده است، بزرگنمایی کنیم، برای این کار ما به یک جعبه مرزی برای ایالت میشیگان نیاز داریم.
برای این کار من از یک ابزار بسیار نرم از Keene برای ترسیم کادر محدود کننده حصار جغرافیایی استفاده کردم و آرایه مختصات را به من می دهد!
اکنون که آرایه مختصات جعبه مرزی را داریم، باید آنها را در یک شی Polygon قرار دهیم.
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
)
])
اکنون، اجازه دهید دنباله ریویان R1S را ترسیم کنیم! این برای حدود 10000 رکورد خواهد بود (من از عبارت بالا برای محدود کردن نتایج استفاده کردم)
ax = michigan.clip(polygon).plot(color="lightblue", alpha=0.5,linewidth=0.8, edgecolor='gray')
ax.axis('off')
ax.annotate("Data: Rivian R1S Telemetry Data via InterSystems Document Database", xy=(0.01, .085), xycoords='figure fraction', fontsize=14, color='#555555')
gdf.plot(ax=ax, color="red", markersize=1.50, alpha=0.5, figsize=(200,200))
و اینجا داریم… دیترویت، تراورس سیتی، تپه های شنی دریاچه نقره ای، هلند، دریاچه مالت، اینترلاخن… میشیگان خالص، سبک ریویان.