Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
chetanhiwale
Helper II
Helper II

Real time data transformation options

I am trying to understand what are the all possible transformation options available for real time data. After studying real time intelligence experience in fabric, I can pin point few of them

1. Transformation available in Eventstream

2. KQL update policy ( not possible, when using joins )

Apart from this , did I miss something, please suggest. 


At the core, I am looking how can I transform data using medallion architecture. For bronze we can leverage update policy, for silver to gold , we can leverage materzied views. Issue arises in silver layer, as join doesnt fully support update policy (streaming ingestion need to be disabled). This makes difficult to perform joins.  Is there any other approach to process real time data. Please suggest your thoughts folks, also please correct me if I am wrong. 

1 ACCEPTED SOLUTION
datacoffee
Most Valuable Professional
Most Valuable Professional

Hi

 

There is no rule to use update policies or mat.views at those places. So you could use the mat.views where you need joins.

 

You can also use joins in the Eventstream - even though they are a bit different.

 

When I wrote my blogpost and the YouTube video on the RTI medallion architecture, I also used update policies for silver and mat.view for gold. But that is not given. Those are just examples, and can be used there they fit in your process.

 

i hope you can find a way to succeed, or else let me know. I will gladly help 😊

 

If this is useful, please consider accepting it as a answer.


If you find this reply to help with your problem, please consider hitting the accept button...
----------------
Blog: https://dcode.bi
KQL ref guide: https://aka.bi/kql
LinkedIn: https://aka.bi/follow

View solution in original post

8 REPLIES 8
FabricPupil
Frequent Visitor

Can we write custom code to consolidate data between two stream data

aayushiharalal
Frequent Visitor

Thank you so much for clarifying my doubt! I truly appreciate the detailed explanation. The post was extremely helpful, and I will definitely look into this further. Your knowledge and insights are invaluable.

Thanks again for sharing your expertise!

nilendraFabric
Community Champion
Community Champion

Hello @chetanhiwale 

 

You’re on the right track with your understanding of real-time data transformation options in Microsoft Fabric’s Real-Time Intelligence experience. Let’s explore the available options and how they fit into the medallion architecture:
Real-Time Data Transformation Options
1. Eventstream Transformations
Eventstream in Microsoft Fabric offers several transformation options for real-time data processing:
• Filter: Allows you to filter out events based on specific conditions.
• Manage Fields: Enables selection, renaming, or removal of specific fields.
• Aggregate: Performs aggregate calculations on data, such as summing values or calculating averages.
• Stream: Chains streams together for advanced processing workflows.
• Activator: Triggers actions based on real-time data conditions or thresholds.
2. KQL Update Policies
KQL update policies are indeed a powerful tool for transforming data in real-time, especially within the bronze layer of the medallion architecture. However, as you correctly noted, they have limitations when it comes to joins, particularly when streaming ingestion is enabled.
3. Materialized Views
Materialized views are excellent for transforming data from the silver to gold layer, as you mentioned. They provide up-to-date results of aggregation queries and are more performant than running aggregations directly on source tables.
Medallion Architecture in Real-Time Processing
Let’s break down the transformation options for each layer of the medallion architecture:
Bronze Layer
• Use Eventstream for initial data ingestion and basic transformations.
• Apply KQL update policies for simple transformations without joins.
Silver Layer
This is where the challenge lies, especially for complex transformations involving joins. Here are some approaches to consider:
1. Batch Processing with Update Policies: Disable streaming ingestion temporarily to allow for more complex transformations, including joins. This approach sacrifices some real-time aspects but can be scheduled frequently to minimize latency.
2. Intermediate Tables: Create intermediate tables that aggregate or pre-process data, which can then be joined more efficiently.
3. Materialized Views: For some scenarios, you might be able to use materialized views to pre-aggregate data, reducing the need for complex joins in real-time.
4. Custom ETL Processes: Implement custom ETL processes using Spark or other data processing frameworks within Fabric to handle complex transformations.
Gold Layer
• Utilize materialized views for final aggregations and business-ready data.
• Implement KQL queries for ad-hoc analysis and reporting.

 

please accept the solution if this helps.

Thanks

datacoffee
Most Valuable Professional
Most Valuable Professional

Hi

 

There is no rule to use update policies or mat.views at those places. So you could use the mat.views where you need joins.

 

You can also use joins in the Eventstream - even though they are a bit different.

 

When I wrote my blogpost and the YouTube video on the RTI medallion architecture, I also used update policies for silver and mat.view for gold. But that is not given. Those are just examples, and can be used there they fit in your process.

 

i hope you can find a way to succeed, or else let me know. I will gladly help 😊

 

If this is useful, please consider accepting it as a answer.


If you find this reply to help with your problem, please consider hitting the accept button...
----------------
Blog: https://dcode.bi
KQL ref guide: https://aka.bi/kql
LinkedIn: https://aka.bi/follow

Hello
I have same senerio where I need to work with real-time ETL with medallion architecture, but the catch here is I have to use LakeHouse as a dataset. Can you please suggest a flow where we can move with medallion arthitecture.

datacoffee
Most Valuable Professional
Most Valuable Professional

Hello
Sure - if data is stored in a Lakehouse, then I would look into creating a shortcut from the Lakehouse to the Eventhouse. Then you have data as external tables and can use the update policies and materialized views as normal



If you find this reply to help with your problem, please consider hitting the accept button...
----------------
Blog: https://dcode.bi
KQL ref guide: https://aka.bi/kql
LinkedIn: https://aka.bi/follow

Thank you for the reply. I will look into it practically.
I would like to know one more thing from you. 
While I was working with the same sample data as metioned in the Blog Post, it indicates two Tables. Those are:
NYCTaxi
Vendors
but while I am loading it using the Event stream I can only see NYCTaxi. I am not sure if I am missing any step or some point for the same.
Please guide.

datacoffee
Most Valuable Professional
Most Valuable Professional

Surely

 

 The vendors table is a manual table I've made for the demo of the blogpost. Only to show how to make joins. You don't need it to use the Eventstream and get data all the way to the gold layer


If you find this reply to help with your problem, please consider hitting the accept button...
----------------
Blog: https://dcode.bi
KQL ref guide: https://aka.bi/kql
LinkedIn: https://aka.bi/follow

Helpful resources

Announcements
MarchFBCvideo - carousel

Fabric Monthly Update - March 2025

Check out the March 2025 Fabric update to learn about new features.

March2025 Carousel

Fabric Community Update - March 2025

Find out what's new and trending in the Fabric community.

"); $(".slidesjs-pagination" ).prependTo(".pagination_sec"); $(".slidesjs-pagination" ).append("
"); $(".slidesjs-play.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-stop.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-pagination" ).append(""); $(".slidesjs-pagination" ).append(""); } catch(e){ } /* End: This code is added by iTalent as part of iTrack COMPL-455 */ $(".slidesjs-previous.slidesjs-navigation").attr('tabindex', '0'); $(".slidesjs-next.slidesjs-navigation").attr('tabindex', '0'); /* start: This code is added by iTalent as part of iTrack 1859082 */ $('.slidesjs-play.slidesjs-navigation').attr('id','playtitle'); $('.slidesjs-stop.slidesjs-navigation').attr('id','stoptitle'); $('.slidesjs-play.slidesjs-navigation').attr('role','tab'); $('.slidesjs-stop.slidesjs-navigation').attr('role','tab'); $('.slidesjs-play.slidesjs-navigation').attr('aria-describedby','tip1'); $('.slidesjs-stop.slidesjs-navigation').attr('aria-describedby','tip2'); /* End: This code is added by iTalent as part of iTrack 1859082 */ }); $(document).ready(function() { if($("#slides .item").length < 2 ) { /* Fixing Single Slide click issue (commented following code)*/ // $(".item").css("left","0px"); $(".item.slidesjs-slide").attr('style', 'left:0px !important'); $(".slidesjs-stop.slidesjs-navigation").trigger('click'); $(".slidesjs-previous").css("display", "none"); $(".slidesjs-next").css("display", "none"); } var items_length = $(".item.slidesjs-slide").length; $(".slidesjs-pagination-item > button").attr("aria-setsize",items_length); $(".slidesjs-next, .slidesjs-pagination-item button").attr("tabindex","-1"); $(".slidesjs-pagination-item button").attr("role", "tab"); $(".slidesjs-previous").attr("tabindex","-1"); $(".slidesjs-next").attr("aria-hidden","true"); $(".slidesjs-previous").attr("aria-hidden","true"); $(".slidesjs-next").attr("aria-label","Next"); $(".slidesjs-previous").attr("aria-label","Previous"); //$(".slidesjs-stop.slidesjs-navigation").attr("role","button"); //$(".slidesjs-play.slidesjs-navigation").attr("role","button"); $(".slidesjs-pagination").attr("role","tablist").attr("aria-busy","true"); $("li.slidesjs-pagination-item").attr("role","list"); $(".item.slidesjs-slide").attr("tabindex","-1"); $(".item.slidesjs-slide").attr("aria-label","item"); /*$(".slidesjs-stop.slidesjs-navigation").on('click', function() { var itemNumber = parseInt($('.slidesjs-pagination-item > a.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); });*/ $(".slidesjs-stop.slidesjs-navigation, .slidesjs-pagination-item > button").on('click keydown', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); var itemNumber = parseInt($('.slidesjs-pagination-item > button.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); }); $(".slidesjs-play.slidesjs-navigation").on('click', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); }); $(".slidesjs-pagination-item button").keyup(function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); $(".slidesjs-stop.slidesjs-navigation").trigger('click').blur(); $("button.active").focus(); } }); $(".slidesjs-play").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-stop").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-play")) { $(".slidesjs-stop").focus(); } } }); $(".slidesjs-stop").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-play").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-stop")) { $(".slidesjs-play").focus(); } } }); $(".slidesjs-pagination-item").keydown(function(e){ switch (e.which){ case 37: //left arrow key $(".slidesjs-previous.slidesjs-navigation").trigger('click'); e.preventDefault(); break; case 39: //right arrow key $(".slidesjs-next.slidesjs-navigation").trigger('click'); e.preventDefault(); break; default: return; } $(".slidesjs-pagination-item button.active").focus(); }); }); // Start This code is added by iTalent as part of iTrack 1859082 $(document).ready(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); $("#tip2").attr("aria-hidden","true").addClass("hidden"); $(".slidesjs-stop.slidesjs-navigation, .slidesjs-play.slidesjs-navigation").attr('title', ''); $("a#playtitle").focus(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").mouseover(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").blur(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#playtitle").mouseleave(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#play").keydown(function(ev){ if (ev.which ==27) { $("#tip1").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); $("a#stoptitle").focus(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").mouseover(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").blur(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").mouseleave(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").keydown(function(ev){ if (ev.which ==27) { $("#tip2").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); }); // End This code is added by iTalent as part of iTrack 1859082
Top Solution Authors