{"id":17256,"date":"2025-01-30T13:05:30","date_gmt":"2025-01-30T11:05:30","guid":{"rendered":"https:\/\/spatialworld.fi\/?page_id=17256"},"modified":"2025-02-05T18:06:15","modified_gmt":"2025-02-05T16:06:15","slug":"17076-2-2-3-2-2","status":"publish","type":"page","link":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/","title":{"rendered":"Superset Druid Transport"},"content":{"rendered":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1 class=\"reader-article-header__title\" dir=\"ltr\"><span data-scaffold-immersive-reader-title=\"\">Analyzing Bus Accessibility using FME, Druid, and Superset: A Step-by-Step Tutorial<\/span><\/h1>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17280&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;75%&#8221; max_width_mobile=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h2 id=\"ember2057\" class=\"ember-view reader-text-block__heading-2\">Context<\/h2>\n<blockquote id=\"ember2058\" class=\"ember-view reader-text-block__blockquote\"><p>Understanding urban bus accessibility requires analyzing both spatial and temporal data. This tutorial demonstrates how to manage and visualize such complex data efficiently using Superset, FME, and Druid.<\/p><\/blockquote>\n<p id=\"ember2059\" class=\"ember-view reader-text-block__paragraph\">In urban areas, spatial-temporal dynamics like commuting present complex challenges that require robust tools to analyze multiple variables and vast amounts of data effectively. Understanding bus accessibility involves not only the geospatial distribution of bus stops but also the temporal aspects of transit schedules. Time is a crucial component, as accessibility varies throughout the day, week, and in different areas, impacting how well different population segments are served.<\/p>\n<p id=\"ember2060\" class=\"ember-view reader-text-block__paragraph\">In the realm of modern business intelligence, integrating and analyzing complex geospatial and temporal data remains a significant challenge. Superset, coupled with FME and Druid, provides a powerful solution for managing these complexities efficiently. This combination allows for the integration of multiple sources of complex data at scale while maintaining low latency, minimal coding requirements, and robust visualization capabilities.<\/p>\n<h2 id=\"ember2061\" class=\"ember-view reader-text-block__heading-2\">Goal<\/h2>\n<p id=\"ember2062\" class=\"ember-view reader-text-block__paragraph\">We aim to generate a data point for each bus arrival at every stop over the next three months, resulting in multiple entries per stop to capture the complete schedule with FME. We will then slice through this data to get insights really fast with Druid through Superset.<\/p>\n<hr class=\"reader-divider-block__horizontal-rule\" \/>\n<h2 id=\"ember2063\" class=\"ember-view reader-text-block__heading-2\">Input Data<\/h2>\n<p id=\"ember2064\" class=\"ember-view reader-text-block__paragraph\"><strong>GTFS Files: This specification is used to exchange planned transport. it is used in many countries. <\/strong><\/p>\n<p id=\"ember2065\" class=\"ember-view reader-text-block__paragraph\">For Helsinki, data is accessible at : <a class=\"qHTFgUmLyluvQraIwmWJYQgdGztEheAxLmaY \" href=\"https:\/\/www.hsl.fi\/en\/hsl\/open-data#public-transport-network-and-timetables-gtfs\" target=\"_self\" data-test-app-aware-link=\"\">https:\/\/www.hsl.fi\/en\/hsl\/open-data#public-transport-network-and-timetables-gtfs<\/a>.<\/p>\n<p id=\"ember2066\" class=\"ember-view reader-text-block__paragraph\">We used the following files for our study:<\/p>\n<ul>\n<li>stops.txt: Contains details of bus stops.<\/li>\n<li>stop_times.txt: Provides schedule information.<\/li>\n<li>trips.txt: Defines trips with specific routes.<\/li>\n<li>routes.txt: Describes routes.<\/li>\n<li>calendar.txt: Specifies operational days.<\/li>\n<li>calendar_dates.txt: Lists schedule exceptions.<\/li>\n<li>shapes.txt: Maps the physical paths of routes.<\/li>\n<\/ul>\n[\/vc_column_text][image_with_animation image_url=&#8221;17279&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h2 id=\"ember2069\" class=\"ember-view reader-text-block__heading-2\">Main Steps<\/h2>\n<ol>\n<li>Data Preparation: FME Read and clean\/adapt GTFS files.<\/li>\n<li>Druid Integration: Integrate into Druid.<\/li>\n<li>Visualization: Publish the data as charts in Superset.<\/li>\n<\/ol>\n<h2 id=\"ember2071\" class=\"ember-view reader-text-block__heading-2\">Data Preparation with FME<\/h2>\n<blockquote id=\"ember2072\" class=\"ember-view reader-text-block__blockquote\"><p>We aim to generate a data point for each bus arrival at every stop over the next three months, resulting in multiple entries per stop to capture the complete schedule.<\/p><\/blockquote>\n<p id=\"ember2073\" class=\"ember-view reader-text-block__paragraph\">There are multiple joins involved, allowing to go through most of FME &#8220;merging&#8221; transformers, for the sake of demonstration. The other main concern comes from the time related attributes.<\/p>\n<h3 id=\"ember2074\" class=\"ember-view reader-text-block__heading-3\">From Calendar and exceptions to datetime<\/h3>\n<p id=\"ember2075\" class=\"ember-view reader-text-block__paragraph\">In the calendar table, each service has a start date, an end date, and operational days, resembling a typical bus stop timetable but not in ISO datetime format. Additionally, &#8220;Calendar Dates&#8221; specifies exception days, adding complexity.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17278&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<div class=\"reader-image-block reader-image-block--full-width\">\n<figure class=\"reader-image-block__figure\"><figcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\">Steps for service dates in FME<\/figcaption><\/figure>\n<\/div>\n<p id=\"ember2077\" class=\"ember-view reader-text-block__paragraph\">Here are the steps we used:<\/p>\n<ul>\n<li><strong> Read the calendar table in FME<\/strong><\/li>\n<\/ul>\n<blockquote>\n<pre class=\"reader-text-block__code-block\">service_id | monday | tuesday | wednesday | thursday | friday | saturday | sunday | start_date | end_date\r\n1001       | 0      | 0       | 1         | 0        | 0      | 0        | 0      | 20240522   | 20240602<\/pre>\n<\/blockquote>\n<ul>\n<li><strong>Map this to actual dates, using Datetime library in PythonCaller to <\/strong><\/li>\n<\/ul>\n<blockquote>\n<pre class=\"reader-text-block__code-block\">def get_specific_day_dates(start_date, end_date, day_of_week):\r\n\r\n    start_date = datetime.strptime(start_date, '%Y%m%d')\r\n    end_date = datetime.strptime(end_date, '%Y%m%d')\r\n    current_date = start_date\r\n    dates_list = []\r\n\r\n    # Convert day_of_week from 1-7 to 0-6 (to match Python's weekday where Monday is 0)\r\n    day_of_week = (day_of_week - 1) % 7\r\n\r\n    while current_date &lt;= end_date:\r\n        if current_date.weekday() == day_of_week:\r\n            dates_list.append(current_date.strftime('%Y%m%d'))\r\n        current_date += timedelta(days=1)\r\n\r\n    return dates_list<\/pre>\n<\/blockquote>\n<ul>\n<li><strong>Read and merge the service exceptions<\/strong> to keep only the dates not merged as &#8220;calendar_dates&#8221; structure is very straightforward. FeatureMerger is good enough for this. The data is not perfect and some exception days are incoherent but it is enough for our purpose.<\/li>\n<\/ul>\n<blockquote>\n<pre class=\"reader-text-block__code-block\">service_id\tdate\texception_type\r\n\r\n1001_20240522_20240602_Pe\t20240531\t2<\/pre>\n<\/blockquote>\n[\/vc_column_text][image_with_animation image_url=&#8221;17277&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<div class=\"reader-image-block reader-image-block--full-width\" style=\"text-align: center;\">\n<figure class=\"reader-image-block__figure\"><figcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"><em>merger based on service_id to filter out exception&#8217;s dates<\/em><\/figcaption><\/figure>\n<\/div>\n<hr class=\"reader-divider-block__horizontal-rule\" \/>\n<h3 id=\"ember2082\" class=\"ember-view reader-text-block__heading-3\">From Service dates to Stop points through a cascade of Joins<\/h3>\n[\/vc_column_text][image_with_animation image_url=&#8221;17276&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p id=\"ember2084\" class=\"ember-view reader-text-block__paragraph\">We now got 1 date for each day there is a service. We want to joins this information to all trips of the day and then to all stops of each trip..<\/p>\n<ul>\n<li>Join with <strong>trips <\/strong>using FeatureJoiner, faster and closer to a classic SQL join, based on service_id key. As you can see below, the data is not perfect. It is not relevant for us (around 1% and we are just building a demo) but it does show how great FME pipeline is good to improve data quality while building the pipeline. In pure SQL we might have missed these validation requests.<\/li>\n<\/ul>\n[\/vc_column_text][image_with_animation image_url=&#8221;17275&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<ul>\n<li>Complementary joins done through Inlinequerier. This transformer is really handy as it allows to create on the fly a temporary SQLite database based on the current data and perform SQL queries on it. As a side remark, in many cases, as we will see later, Duckdb would be much faster. We hope Safe will implement it as soon as possible &#x1f609;.<\/li>\n<\/ul>\n[\/vc_column_text][image_with_animation image_url=&#8221;17274&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<blockquote>\n<pre class=\"reader-text-block__code-block\">SELECT \r\n    r.route_id,\r\n    r.route_short_name,\r\n    r.route_long_name,\r\n    t.trip_id,\r\n    t.service_id,\r\n    t.trip_date,\r\n    t.shape_id,\r\n    st.stop_sequence,\r\n    st.arrival_time,\r\n    st.departure_time,\r\n    s.stop_id,\r\n    s.stop_name,\r\n    s.stop_lat,\r\n    s.stop_lon\r\nFROM \r\n    trips t\r\nJOIN \r\n    routes r ON t.route_id = r.route_id\r\nJOIN \r\n    stop_times st ON t.trip_id = st.trip_id\r\nJOIN \r\n    stops s ON st.stop_id = s.stop_id<\/pre>\n<\/blockquote>\n<p id=\"ember2089\" class=\"ember-view reader-text-block__paragraph\"><em>As a side note, we did not take into account the extra hours of service described in the gtfs format. For example a trip starting on the Friday service but ending at 1AM on Saturday is written <\/em><\/p>\n<hr class=\"reader-divider-block__horizontal-rule\" \/>\n<h3 id=\"ember2090\" class=\"ember-view reader-text-block__heading-3\">Write to Parquet<\/h3>\n<p id=\"ember2091\" class=\"ember-view reader-text-block__paragraph\">This part is simple, just be careful to check the types. Parquet is fast, compact and supported by Druid, this is why it was picked. We have here close to 70 million points. We decided to keep as many attributes as possible to make the analysis more flexible, but it will be costly later. On the other hand, no other dataset was joined but it is clear that some field on the local area or local population density would help for more in-depth analysis. FME strength would shine even more.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17273&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<hr class=\"reader-divider-block__horizontal-rule\" \/>\n<h2 id=\"ember2093\" class=\"ember-view reader-text-block__heading-2\">Druid Integration<\/h2>\n<p id=\"ember2094\" class=\"ember-view reader-text-block__paragraph\">Druid in a real time oriented OLAP able to handle a huge amount of queries and data. We chose it for fun but also as it is better suited than PostgreSQL for the kind of time slicing analysis we want to play with, at scale. For more info : <a class=\"qHTFgUmLyluvQraIwmWJYQgdGztEheAxLmaY \" href=\"https:\/\/druid.apache.org\/\" target=\"_self\" data-test-app-aware-link=\"\">https:\/\/druid.apache.org\/<\/a><\/p>\n<h3 id=\"ember2095\" class=\"ember-view reader-text-block__heading-3\">Installation<\/h3>\n<p id=\"ember2096\" class=\"ember-view reader-text-block__paragraph\">We installed it through docker-compose. You can contact us if you want the file, it is much more straight forward than we expected.<\/p>\n<p id=\"ember2097\" class=\"ember-view reader-text-block__paragraph\">Small change from the vanilla installation : Add the extension for parquet.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17272&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3 id=\"ember2099\" class=\"ember-view reader-text-block__heading-3\">Data loading<\/h3>\n<p id=\"ember2100\" class=\"ember-view reader-text-block__paragraph\">Once installed you get a nice UI were you can load data as a batch (or a stream). You can also use the API to load data or process queries, which is nice for production if you combine it with FME Flow or any automation manager\/scheduler.<\/p>\n<p id=\"ember2101\" class=\"ember-view reader-text-block__paragraph\">Some tricks were still needed if, like us, you are a beginner with this database :<\/p>\n<ol>\n<li>When loading the data in batch mode, if you want to select a local folder it needs to be present in multiple containers in the same subfolder. In our case, with docker, we uploaded the parquet file to the historical, the coordinator and the middlemanager containers. If it is not the case, the error messages are not that great<\/li>\n<li>You need to specify a datetime field. Sadly we had time fields and date field (trip_date). As merging them required either a better knowledge of druid or a merged date_timestamp, we chose the second option. We loaded the data in duckdb and generated a new parquet file with a concatenated field following ISO as FME was a bit slow in this task&#8230;<\/li>\n<li>Beware of its automatic schema detection as it is not as good as FME&#8217;s.<\/li>\n<li>Ingestion time is a bit long. It should come for our very lack of knowledge on the configuration and from the index generation. Fast data access for OLAP requires to optimize the storage in many ways.<\/li>\n<\/ol>\n<h3 id=\"ember2103\" class=\"ember-view reader-text-block__heading-3\">Data Exploration and first queries<\/h3>\n<p id=\"ember2104\" class=\"ember-view reader-text-block__paragraph\">To check that the data was well loaded, we played with the inline SQL querier of druid and its experimental &#8220;data exploration&#8221; mode. They came really handy when Superset queries got &#8220;unexpected&#8221; results.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17271&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p style=\"text-align: center;\"><em>Druid inline SQL editor with syntax helper<\/em><\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17281&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p style=\"text-align: center;\"><em>Exploration mode, count(*) by day around the 21th of June (best event in Finland) <\/em><\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17270&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<div class=\"reader-image-block reader-image-block--full-width\">\n<figure class=\"reader-image-block__figure\"><figcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\">Number of points per &#8220;line&#8221;, filtered on a week, notice Saturday and Sunday<\/figcaption><\/figure>\n<\/div>\n<hr class=\"reader-divider-block__horizontal-rule\" \/>\n<h2 id=\"ember2109\" class=\"ember-view reader-text-block__heading-2\">Visualization: Creating a Time oriented Dashboard in Superset<\/h2>\n<p id=\"ember2110\" class=\"ember-view reader-text-block__paragraph\">How goal is to set a dashboard allowing to explore the dataset and get a feeling on how public transport evolves based on time and space in the capital area.<\/p>\n<h3 id=\"ember2111\" class=\"ember-view reader-text-block__heading-3\">Installation<\/h3>\n<p id=\"ember2112\" class=\"ember-view reader-text-block__paragraph\">Here again we used docker-compose. We could have even merged with druid but it was not really needed. You can look through this article, as a reference:<\/p>\n<p id=\"ember2113\" class=\"ember-view reader-text-block__paragraph\"><a class=\"qHTFgUmLyluvQraIwmWJYQgdGztEheAxLmaY \" href=\"https:\/\/www.linkedin.com\/pulse\/geospatial-insights-unlocked-excel-data-integration-superset-za7mf\/\" target=\"_self\" data-test-app-aware-link=\"\">https:\/\/www.linkedin.com\/pulse\/geospatial-insights-unlocked-excel-data-integration-superset-za7mf\/<\/a><\/p>\n<h3 id=\"ember2114\" class=\"ember-view reader-text-block__heading-3\">Connect to druid database<\/h3>\n<ul>\n<li>Go to Settings \/ Database<\/li>\n<\/ul>\n<p id=\"ember2116\" class=\"ember-view reader-text-block__paragraph\">&#8211; Add Druid connection, if it you are using it like us with docker, it should be something like <em>druid:\/\/host.docker.internal:8888\/druid\/v2\/sql\/<\/em><\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17269&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<ul>\n<li>Create your dataset by pointing to the database.<\/li>\n<\/ul>\n<p id=\"ember2119\" class=\"ember-view reader-text-block__paragraph\">Your data should be loaded in a data source of your choice under the schema &#8220;druid&#8221;.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17268&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3 id=\"ember2121\" class=\"ember-view reader-text-block__heading-3\">Setting up a map chart<\/h3>\n<p id=\"ember2122\" class=\"ember-view reader-text-block__paragraph\">We want to see 1 point for each bus stop but not all the timestamps. For this we pick the <a class=\"qHTFgUmLyluvQraIwmWJYQgdGztEheAxLmaY \" href=\"http:\/\/deck.gl\/\" target=\"_self\" data-test-app-aware-link=\"\">deck.gl<\/a> scatterplot, config the lat long fields and set the color by &#8220;line&#8221;.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17267&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][image_with_animation image_url=&#8221;17266&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3 id=\"ember2127\" class=\"ember-view reader-text-block__heading-3\">Setting up a time chart<\/h3>\n<p id=\"ember2128\" class=\"ember-view reader-text-block__paragraph\">We want to see how the network looks like depending on the hour of the day.<\/p>\n<ul>\n<li>Add a &#8220;calculated column&#8221; in Superset.<\/li>\n<\/ul>\n<p id=\"ember2130\" class=\"ember-view reader-text-block__paragraph\">We could have update the datasource in druid. but let&#8217;s see how to add a column computed dynamically to show superset flexibility.<\/p>\n<p id=\"ember2131\" class=\"ember-view reader-text-block__paragraph\">Just go to your dataset, click edit and enter your column name and the sql select giving the desired value.<\/p>\n<p id=\"ember2132\" class=\"ember-view reader-text-block__paragraph\">Here the SQL is simple :<\/p>\n<blockquote>\n<pre class=\"reader-text-block__code-block\"> EXTRACT(HOUR FROM \"__time\")<\/pre>\n<\/blockquote>\n[\/vc_column_text][image_with_animation image_url=&#8221;17265&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<ul>\n<li>Add a table chart<\/li>\n<\/ul>\n<p id=\"ember2135\" class=\"ember-view reader-text-block__paragraph\">There you just need to pick your field, select Count(*) as a metric and it just works<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17264&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][image_with_animation image_url=&#8221;17282&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h3 id=\"ember2138\" class=\"ember-view reader-text-block__heading-3\">Create your dashboard<\/h3>\n<p id=\"ember2139\" class=\"ember-view reader-text-block__paragraph\">One of the strongest points of superset is the interactivity of the dashboard. As you select an element on 1 chart, all the other ones are updated to reflect the change, allowing to see the same data from different perspective.<\/p>\n<ul>\n<li>Add your charts<\/li>\n<\/ul>\n<p id=\"ember2141\" class=\"ember-view reader-text-block__paragraph\">When creating a dashboard, all available charts are listed and can be added with a drag and drop.<\/p>\n<div class=\"reader-image-block reader-image-block--full-width\"><\/div>\n[\/vc_column_text][image_with_animation image_url=&#8221;17263&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<ul>\n<li>Organize them<\/li>\n<\/ul>\n<p id=\"ember2144\" class=\"ember-view reader-text-block__paragraph\">When creating a dashboard, you can customize the location size of each chart and add text and dividers as in any modern webpage builder. You can even customize the CSS if you are more into front-end.<\/p>\n[\/vc_column_text][image_with_animation image_url=&#8221;17262&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h2 id=\"ember2146\" class=\"ember-view reader-text-block__heading-2\">Play with the data!<\/h2>\n[\/vc_column_text][image_with_animation image_url=&#8221;17261&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][image_with_animation image_url=&#8221;17260&#8243; image_size=&#8221;medium_large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<div class=\"reader-image-block reader-image-block--full-width\" style=\"text-align: center;\">\n<figure class=\"reader-image-block__figure\"><figcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"><em>Line 40 on Sundays (UTC time)<\/em><\/figcaption><\/figure>\n<\/div>\n<h2 id=\"ember2149\" class=\"ember-view reader-text-block__heading-2\">Conclusion<\/h2>\n<p id=\"ember2150\" class=\"ember-view reader-text-block__paragraph\">The integration of Superset, FME, and Druid offers a powerful solution for analyzing complex spatial-temporal data in urban transportation systems. This architecture efficiently processes and visualizes extensive datasets, providing valuable insights into public transport accessibility.<\/p>\n<h3 id=\"ember2151\" class=\"ember-view reader-text-block__heading-3\">Benefits of this Architecture<\/h3>\n<p id=\"ember2152\" class=\"ember-view reader-text-block__paragraph\"><strong>Scalability and Efficiency<\/strong>: The architecture handles large datasets with low latency, crucial for urban planners and transport authorities needing quick, reliable data analysis.<\/p>\n<p id=\"ember2153\" class=\"ember-view reader-text-block__paragraph\"><strong>Flexibility and Minimal Coding<\/strong>: With visual tools and minimal coding requirements, this setup is accessible to users with varying technical backgrounds, allowing for quick adaptation to different datasets and analytical needs.<\/p>\n<p id=\"ember2154\" class=\"ember-view reader-text-block__paragraph\"><strong>Comprehensive Visualization<\/strong>: Superset&#8217;s interactive dashboards offer dynamic insights, enabling users to identify patterns and trends in public transportation data, aiding informed decision-making.<\/p>\n<p id=\"ember2155\" class=\"ember-view reader-text-block__paragraph\"><strong>Versatile Use Cases<\/strong>: Beyond urban transportation, this architecture can be applied to smart cities, retail, logistics, healthcare, and environmental monitoring, providing valuable insights across various sectors.<\/p>\n<p id=\"ember2156\" class=\"ember-view reader-text-block__paragraph\">In summary, the combination of Superset, FME, and Druid provides a scalable, flexible, and powerful architecture for managing and analyzing complex spatial-temporal data.<\/p>\n[\/vc_column_text][\/vc_column][\/vc_row]","protected":false},"excerpt":{"rendered":"<p>[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;&#8230;<\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17256","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Superset Druid Transport - Spatialworld Oy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Superset Druid Transport - Spatialworld Oy\" \/>\n<meta property=\"og:description\" content=\"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Spatialworld Oy\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-05T16:06:15+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data1\" content=\"21 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/\",\"url\":\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/\",\"name\":\"Superset Druid Transport - Spatialworld Oy\",\"isPartOf\":{\"@id\":\"https:\/\/spatialworld.fi\/sv\/#website\"},\"datePublished\":\"2025-01-30T11:05:30+00:00\",\"dateModified\":\"2025-02-05T16:06:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/\"]]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/spatialworld.fi\/sv\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Druid ja Superset\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/spatialworld.fi\/sv\/#website\",\"url\":\"https:\/\/spatialworld.fi\/sv\/\",\"name\":\"Spatialworld Oy\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/spatialworld.fi\/sv\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Superset Druid Transport - Spatialworld Oy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/","og_locale":"sv_SE","og_type":"article","og_title":"Superset Druid Transport - Spatialworld Oy","og_description":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...","og_url":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/","og_site_name":"Spatialworld Oy","article_modified_time":"2025-02-05T16:06:15+00:00","twitter_misc":{"Ber\u00e4knad l\u00e4stid":"21 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/","url":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/","name":"Superset Druid Transport - Spatialworld Oy","isPartOf":{"@id":"https:\/\/spatialworld.fi\/sv\/#website"},"datePublished":"2025-01-30T11:05:30+00:00","dateModified":"2025-02-05T16:06:15+00:00","breadcrumb":{"@id":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/"]]}]},{"@type":"BreadcrumbList","@id":"https:\/\/spatialworld.fi\/sv\/17076-2-2-3-2-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spatialworld.fi\/sv\/"},{"@type":"ListItem","position":2,"name":"Druid ja Superset"}]},{"@type":"WebSite","@id":"https:\/\/spatialworld.fi\/sv\/#website","url":"https:\/\/spatialworld.fi\/sv\/","name":"Spatialworld Oy","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spatialworld.fi\/sv\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"}]}},"_links":{"self":[{"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/pages\/17256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/comments?post=17256"}],"version-history":[{"count":9,"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/pages\/17256\/revisions"}],"predecessor-version":[{"id":17320,"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/pages\/17256\/revisions\/17320"}],"wp:attachment":[{"href":"https:\/\/spatialworld.fi\/sv\/wp-json\/wp\/v2\/media?parent=17256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}