<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Goodman on BI</title>
	<atom:link href="http://www.nicholasgoodman.com/bt/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nicholasgoodman.com/bt/blog</link>
	<description>Musings on reporting, OLAP, ETL, open source</description>
	<pubDate>Fri, 05 Jun 2009 23:30:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<item>
		<title>Off Topic: My First Airplane Solo</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/06/05/off-topic-my-first-airplane-solo/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/06/05/off-topic-my-first-airplane-solo/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 18:10:21 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=365</guid>
		<description><![CDATA[I&#8217;ve wanted to fly since I was 14.  I started training in 2004, but cut it short when I moved from Boston to Seattle.  The wife was kind enough to give me a swift kick in the butt telling me to go get the license now; doing so later in life will be more difficult.
In [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve wanted to fly since I was 14.  I started training in 2004, but cut it short when I moved from Boston to Seattle.  The wife was kind enough to give me a swift kick in the butt telling me to go get the license now; doing so later in life will be more difficult.</p>
<p>In May I logged 15 hours of dual instruction at Boeing Field (short 15 min drive from my house) and yesterday I soloed the 172 Skyhawk N52139 for the first time.</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/06/first_solo.jpg"><img class="alignnone size-medium wp-image-366" title="first_solo" src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/06/first_solo-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>I was expecting the solo to be intense; thinking intensely and hearing my instructors voice in my head with all the things that have to happen all at the same time to get the plane safely on the ground.  Instead, I found that after the training, I know how to simply &#8220;fly the plane&#8221; and was just doing what I knew the plane needed to land softly without much thinking.  After 2 touch and gos and a full stop landing both me and my instructor concluded I&#8217;ve acquired the &#8220;walking and chewing gum&#8221; skills when it comes to flying.</p>
<p>I&#8217;ll be continuing training hours over the next couple of months.  I&#8217;m aiming for September for getting my license so I can take my wife places with me in the plane.  After all, her encouragement is what got me going on this old aspiration; least I can do is fly her to dinner in the San Juans.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/06/05/off-topic-my-first-airplane-solo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MDX Humor from Portugal</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/04/21/mdx-humor-from-portugal/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/04/21/mdx-humor-from-portugal/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 23:59:59 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[General BI]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/2009/04/21/mdx-humor-from-portugal/</guid>
		<description><![CDATA[Pedro Alves, the very talented lead developer behind the Pentaho Community Dashboard Framework gave me a good chuckle with his high opinion of MDX as a language:
MDX is God&#8217;s gift to business language; When God created Adam and Eve he just spoke [Humanity].[All Members].Children . That&#8217;s how powerful MDX is. And Julian Hyde allowed to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pedroalves-bi.blogspot.com/">Pedro Alves</a>, the very talented lead developer behind the Pentaho Community Dashboard Framework gave me a good chuckle with his <a href="http://pedroalves-bi.blogspot.com/2009/04/dashboard-for-every-role.html">high opinion of MDX as a language</a>:</p>
<blockquote><p>MDX is God&#8217;s gift to business language; When God created Adam and Eve he just spoke [Humanity].[All Members].Children . That&#8217;s how powerful MDX is. And Julian Hyde allowed to use it without being bound to microsoft.</p></blockquote>
<p>If you haven&#8217;t checked out Pedro&#8217;s <a href="http://pedroalves-bi.blogspot.com/">blog</a>, definitely get over there.  It&#8217;s a recent start but he&#8217;s already getting some great stuff posted.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/04/21/mdx-humor-from-portugal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PDI Scale Out Whitepaper</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/04/21/pdi-scale-out-whitepaper/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/04/21/pdi-scale-out-whitepaper/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 23:43:05 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Data Integration (Kettle)]]></category>

		<category><![CDATA[General BI]]></category>

		<category><![CDATA[Grid/Distributed Computing]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/2009/04/21/pdi-scale-out-whitepaper/</guid>
		<description><![CDATA[I&#8217;ve worked with several customers over the past year helping them scale out their data processing using Pentaho Data Integration.  These customers have some big challenges - one customer was expecting 1 billion rows / day to be processed on their ETL environment.  Some of these customers were rolling their own solutions; others [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve worked with several customers over the past year helping them scale out their data processing using Pentaho Data Integration.  These customers have some big challenges - one customer was expecting 1 billion rows / day to be processed on their ETL environment.  Some of these customers were rolling their own solutions; others had very expensive proprietary solutions (Ab Initio I&#8217;m pretty sure however they couldn&#8217;t say since Ab Initio contracts are bizarre).  One thing was common: they all had billions of records, a batch window that remained the same, and software costs that were out of control.</p>
<p>None of these customer specifics are public; they likely won&#8217;t be which is difficult for Bayon / Pentaho because sharing these top level metrics would be helpful for anyone using or evaluating PDI.  Key questions when evaluating a scale out ETL tool:  Does it scale with more nodes?  Does it scale with more data?</p>
<p>I figured it was time to share some of my research, and findings on how PDI scales out and this takes the form of a whitepaper.  Bayon is please to present this free whitepaper, <a href="http://www.bayontechnologies.com/bt/ourwork/pdi_scale_out_whitepaper.php">Pentaho Data Integration : Scaling Out Large Data Volume Processing in the Cloud or on Premise.</a>  In the paper we cover a wide range of topics, including results from running transformations with up to 40 nodes and 1.8 billion rows.</p>
<p>Another interesting set of findings in the paper also relates to a very pragmatic approach in my research - I don&#8217;t have a spare 200k to simply buy 40 servers to run these tests.  I have been using EC2 for quite a while now, and figured it was the perfect environment to see how PDI could scale on the cheapest of cheap servers ($0.10 / hour).  Some other interesting metrics, relating to Cloud ETL is the top level benchmark of a utility compute cost of ETL processing of <strong>6 USD per Billion Rows processed with zero long term infrastructure commitments.<br />
</strong><br />
Matt Casters, myself, and Lance Walter will also be presenting a free online webinar to go over the top level results, and have a discussion on large data volume processing in the cloud:</p>
<p><a href="https://pentaho.webex.com/mw0305l/mywebex/default.do?nomenu=true&amp;siteurl=pentaho&amp;service=6&amp;main_url=https%3A%2F%2Fpentaho.webex.com%2Fec0600l%2Feventcenter%2Fevent%2FeventAction.do%3FtheAction%3Ddetail%26confViewID%3D562356573%26siteurl%3Dpentaho%26%26%26">High Performance ETL using Cloud- and Cluster-based Deployment </a><br />
Tuesday, May 26, 2009 2:00 pm<br />
Eastern Daylight Time (GMT -04:00, New York) </p>
<p>If you&#8217;re interested in processing lots of data with PDI, or wanting to deploy PDI to the cloud, please register for the webinar or contact me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/04/21/pdi-scale-out-whitepaper/feed/</wfw:commentRss>
		</item>
		<item>
		<title>NYC 4/9 and 4/10</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/04/07/nyc-49-and-410/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/04/07/nyc-49-and-410/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 00:15:16 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Professional]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/2009/04/07/nyc-49-and-410/</guid>
		<description><![CDATA[I&#8217;ll be roaming in Manhattan this Thursday and Friday.  Have some plans, but actually have some bits of time.
Anyone want to shoot the breeze about Pentaho / BI / Open Source?  Email me: ngoodman@ignorethispart.com bayontechnologies.com
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be roaming in Manhattan this Thursday and Friday.  Have some plans, but actually have some bits of time.</p>
<p>Anyone want to shoot the breeze about Pentaho / BI / Open Source?  Email me: ngoodman@ignorethispart.com bayontechnologies.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/04/07/nyc-49-and-410/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pentaho Partner Summit</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/04/01/pentaho-partner-summit/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/04/01/pentaho-partner-summit/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 23:48:37 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=358</guid>
		<description><![CDATA[I&#8217;m at the Westin close to the event space for the summit&#8230;
I&#8217;m around tonight - meeting Bryan Senseman from OpenBI a bit later (730 or 800pm).  Anyone else around and want to meet up for dinner?  Email me ngoodman@ignorethispart.com bayontechnologies.com.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m at the Westin close to the event space for the summit&#8230;</p>
<p>I&#8217;m around tonight - meeting Bryan Senseman from OpenBI a bit later (730 or 800pm).  Anyone else around and want to meet up for dinner?  Email me ngoodman@ignorethispart.com bayontechnologies.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/04/01/pentaho-partner-summit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Make Mondrian Dumb</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/02/18/make-mondrian-dumb/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/02/18/make-mondrian-dumb/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 21:34:35 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=354</guid>
		<description><![CDATA[I had a customer recently who had very hierarchical data, with some complicated measures that didn&#8217;t aggregate up according to regular ole aggregation rules (sum, min, max, avg, count, distinct count).  Now, one can do weighted averages using sql expressions in a Measure Expression these rules were complex and they also were dependent on [...]]]></description>
			<content:encoded><![CDATA[<p>I had a customer recently who had very hierarchical data, with some complicated measures that didn&#8217;t aggregate up according to regular ole aggregation rules (sum, min, max, avg, count, distinct count).  Now, one can do weighted averages using sql expressions in a Measure Expression these rules were complex and they also were dependent on the other dimension attributes.  UGGGGH.</p>
<p>Come to that:<strong> their analysts had the pristine, blessed data sets calculated at different rollups (already aggregated to Company Regions).</strong>  Mondrian though, is often too smart for it&#8217;s own good.  If it has data in cache, and things it can roll up a measure to a higher level (Company Companies can be rolled up to Regions if it&#8217;s a SUM for instance) Mondrian will do that.  This is desirable in like 99.9% of cases.  Unless, you want to &#8220;solve&#8221; your cube and just tell Mondrian to read the data from your tables.</p>
<p>I started thinking - since their summary row counts are actually quite small. </p>
<ol>
<li><strong>What if I could get Mondrian to ignore the cache and always ask the database for the result?</strong>  I had never tried the &#8220;cache=&#8221; attribute of a Cube before (it defaults to true and I work with that 99.9% of the world).  Seems like setting it to false does the trick.  Members are read and cached but the cells aren&#8217;t.</li>
<li><strong>What if I could get Mondrian to look to my summary tables for the data instead of aggregating the base fact?</strong>  That just seems like a standard aggregate table calculation.  Configure an aggregate table so Mondrian will read the Company Regions set from the aggregate instead of the fact</li>
</ol>
<p>Looks like I was getting close to what I wanted.  Here&#8217;s the dataset I came up with to test:<br />
<code><br />
mysql&gt; select * from fact_base;<br />
+----------+-----------+-----------+<br />
| measure1 | dim_attr1 | dim_attr2 |<br />
+----------+-----------+-----------+<br />
|        1 | Parent    | Child1    |<br />
|        1 | Parent    | Child2    |<br />
+----------+-----------+-----------+<br />
2 rows in set (0.00 sec)</p>
<p>mysql&gt; select * from agg_fact_base;<br />
+------------+----------+-----------+<br />
| fact_count | measure1 | dim_attr1 |<br />
+------------+----------+-----------+<br />
|          2 |       10 | Parent    |<br />
+------------+----------+-----------+<br />
1 row in set (0.03 sec)</p>
<p>mysql&gt;</code><br />
Here&#8217;s the Mondrian schema I came up with:</p>
<blockquote><p>&lt;Schema name=&#8221;Test&#8221;&gt;<br />
&lt;Cube name=&#8221;TestCube&#8221; cache=&#8221;false&#8221; enabled=&#8221;true&#8221;&gt;<br />
&lt;Table name=&#8221;fact_base&#8221;&gt;<br />
&lt;AggName name=&#8221;agg_fact_base&#8221;&gt;<br />
&lt;AggFactCount column=&#8221;fact_count&#8221;/&gt;<br />
&lt;AggMeasure name=&#8221;[Measures].[Meas1]&#8221; column=&#8221;measure1&#8243; /&gt;<br />
&lt;AggLevel name=&#8221;[Dim1].[Attr1]&#8221; column=&#8221;dim_attr1&#8243; /&gt;<br />
&lt;/AggName&gt;<br />
&lt;/Table&gt;<br />
&lt;Dimension name=&#8221;Dim1&#8243;&gt;<br />
&lt;Hierarchy hasAll=&#8221;true&#8221;&gt;<br />
&lt;Level name=&#8221;Attr1&#8243; column=&#8221;dim_attr1&#8243;/&gt;<br />
&lt;Level name=&#8221;Attr2&#8243; column=&#8221;dim_attr2&#8243;/&gt;<br />
&lt;/Hierarchy&gt;<br />
&lt;/Dimension&gt;<br />
&lt;Measure name=&#8221;Meas1&#8243; column=&#8221;measure1&#8243; aggregator=&#8221;min&#8221;&gt;<br />
&lt;/Measure&gt;<br />
&lt;/Cube&gt;<br />
&lt;/Schema&gt;</p></blockquote>
<p>Notice that the aggregate for Parent in the agg table is &#8220;10&#8243; and the value if the children are summed would be &#8220;2.&#8221; <strong> 2 means it agged the base table = BAD.  10 means it used the summarized data = GOOD.</strong></p>
<p>The key piece I wanted to very is that if I start with an MDX for the CHILDREN and THEN request the Parent will I get the correct value.  Run a cold cache MDX to get the children values:</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235.jpg','popup','width=128,height=89,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235-tm.jpg" height="100" width="143" border="1" hspace="4" vspace="4" alt="200902181235" /></a></p>
<p>Those look good.  Let&#8217;s grab the parent level now, and see what data we get:<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235-1.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235-1.jpg','popup','width=139,height=112,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902181235-1-tm.jpg" height="112" width="138" border="1" hspace="4" vspace="4" alt="200902181235-1" /></a></p>
<p>The result is 10 = GOOD!  I played around with access methods to see if I could get if messed up and on my simple example it didn&#8217;t.  I<strong>&#8216;ll leave it to the comments to point out any potential issues</strong> with this approach but it appears as if setting cache=&#8221;false&#8221; and setting up your aggregate tables properly will cause Mondrian to be a dumb cell reader and simply select out the values you&#8217;ve already precomputed.  Buyer Beware - you&#8217;d have to get REALLY REALLY good agg coverage to handle all the permutations of levels in your Cube.  This could be rough - but it does work.  <img src='http://www.nicholasgoodman.com/bt/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  And caching - it always issues SQL so that might be an issue too.</p>
<p>Sample: <a href="/entry_images/cachetest.zip">cachetest.zip</a></p>
<p>Mondrian - you&#8217;ve been dumbed down!  Take that!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/02/18/make-mondrian-dumb/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Self Service Data Export using Pentaho</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/02/09/self-service-data-export-using-pentaho/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/02/09/self-service-data-export-using-pentaho/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 19:17:22 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Data Integration (Kettle)]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=347</guid>
		<description><![CDATA[Every BI installation has power users that just want &#8220;data dumps.&#8221;  They may need the dumps for a variety of reasons:

You&#8217;ve built crappy reports.  They can&#8217;t get the information they need in *YOUR* reports.
They need to feed the data into another system.  They want to select all customers who bought product X [...]]]></description>
			<content:encoded><![CDATA[<p>Every BI installation has power users that just want &#8220;data dumps.&#8221;  They may need the dumps for a variety of reasons:</p>
<ul>
<li>You&#8217;ve built crappy reports.  They can&#8217;t get the information they need in *YOUR* reports.</li>
<li>They need to feed the data into another system.  They want to select all customers who bought product X in time period Y to send them a recall notice.  Need a dump of email / addresses to send them the notice.</li>
<li>They are addicted to Excel; they feel like a super hero whizzing through the data making fancy graphs and doing a few of their own ratios/calculations.</li>
<li>They want to munge the numbers.  They will export it to Excel, throw out the data that makes them look bad, and then present it to their boss with shiny positive results.</li>
</ul>
<p>I had a customer who needed something to &#8220;feed the data to another system.&#8221;  Their original approach was to write a Pentaho Report that formatted to CSV well, write the parameterized query, and then simply generate the report and return it in the browser.  This seems like a sound approach and would have been my first as well.  They found that it did work well, to a point.  It looked as if the Pentaho Report layer tends to use a bunch of memory for report generation - this is understandable.  The report object is being rendered but is only &#8220;returned&#8221; to Pentaho when it&#8217;s complete.  The entire dataset must be in memory.  Well, needless to say, with this customers heap configuration they found a row threshold (30,000) that caused their Pentaho 1.6 installation to croak.</p>
<p>However, they didn&#8217;t really need to be using Pentaho Reporting.  Kettle, which is included in Pentaho BI Suite has an straightforward performant way to export to CSV.  If we could generate that file, and then simply return the file that we just generated to the browser we&#8217;d have an elegant solution for data export.</p>
<p>The first piece of the puzzle is the data export KTR.  This KTR takes two arguments: Country and Filename.  The Country is the value that will limit the data set that we are outputing (output customers in Italy).  The Filename is the location to put the file.  This isn&#8217;t necessary, but it allows the FILENAME to be set by the caller (.xaction) instead of callee (ktr).  It&#8217;s for convenience.</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902090955.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902090955.jpg','popup','width=487,height=197,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902090955-tm.jpg" height="100" width="247" border="1" hspace="4" vspace="4" alt="200902090955" /></a></p>
<p>I&#8217;ve created a directory in tomcat/webapps/ named &#8220;lz&#8221;, short for landing zone.  This /lz/ directory is accessible via the web browser.  By placing this in this location we can use the same tomcat server that is hosting Pentaho to serve up our data export file as well.</p>
<p>Now, let&#8217;s get to a little bit of the magic of the Action Sequence, data_export.xaction.<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091000.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091000.jpg','popup','width=254,height=476,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091000-tm.jpg" height="100" width="53" border="1" hspace="4" vspace="4" alt="200902091000" /></a></p>
<p>The first thing this action sequence does is to create a list of countries, and then prompt the user to select one.  This is pretty standard stuff, done all the time with Pentaho reports so we won&#8217;t cover the specifics here.</p>
<p>Once we&#8217;ve got our &#8220;country&#8221; defined, we call our &#8220;Pentaho Data Integration&#8221; KTR component with two arguments.  The first is the country the user has just selected and the second is the filename that we&#8217;ve hard coded as an input to our action sequence.  The filename is the location on the local filesystem you would like kettle to generate the file at (ie, /apps/pentaho/tomcat/webapps/lz/data_export_file.csv).</p>
<p>Once we&#8217;ve generated the file in that location, we&#8217;ll send a redirect to the user as the &#8220;output&#8221; of this action sequence.  The user doesn&#8217;t really &#8220;see&#8221; this; the user will just see the .csv arrive in their browser.  The way to get the redirect to work is to add the output to &#8220;response.redirect&#8221; like so:<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091005.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091005.jpg','popup','width=483,height=211,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091005-tm.jpg" height="100" width="228" border="1" hspace="4" vspace="4" alt="200902091005" /></a><br />
The redirect URI is another hard coded value: /lz/data_export_file.csv which should reference the path of the file on the web server.</p>
<p>The user experience is indistinguishable from standard reports.  User is prompted:</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091010.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091010.jpg','popup','width=535,height=174,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091010-tm.jpg" height="100" width="307" border="1" hspace="4" vspace="4" alt="200902091010" /></a></p>
<p>they click &#8220;OK&#8221; and are prompted what do do with their export.<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091011.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091011.jpg','popup','width=445,height=337,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/02/200902091011-tm.jpg" height="100" width="132" border="1" hspace="4" vspace="4" alt="200902091011" /></a></p>
<p><strong>The performance of this solution far surpasses using Pentaho Reporting.  Exports of 10,000 rows that were taking 30-60 seconds were taking 10-15 seconds.  </strong>However, be warned.  The export via Kettle will only have as many formatting options as are present in the &#8220;Text File Output&#8221; step which are many, but limited.  If you need fine control over the format of your data export, you may have to stick with Pentaho Reporting since it does provide a superior set of layout/formatting controls.<br />
It should also be noted that this works with zipped files (to zip up the .csv), and also .XLS exports.  I&#8217;ve provided this sample (<a href="/entry_images/data_export.zip">data_export.zip</a>) that works with Pentaho 2.0 BI (Needs hypersonic sample database).  You&#8217;ll have to adjust the &#8220;filename&#8221; variable to your filesystem before running it for it to work properly (it has the location of my installation).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/02/09/self-service-data-export-using-pentaho/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The death of prevRow = row.clone()</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/01/30/the-death-of-prevrow-rowclone/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/01/30/the-death-of-prevrow-rowclone/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 21:31:30 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Data Integration (Kettle)]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Pentaho]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=330</guid>
		<description><![CDATA[UPDATE: This step is available in Kettle 3.2 M1.
For those that have done more involved Kettle projects you&#8217;ll know how valuable the Javascript step is.  It&#8217;s the Swiss Army knife of Kettle development.  The calculator step is a nice thought, but the limited set of functions and the constriction of having to enter [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE: This step is available in </strong><strong><a href="http://sourceforge.net/project/showfiles.php?group_id=140317&amp;package_id=186321&amp;release_id=657167">Kettle 3.2 M1.</a></strong></p>
<p>For those that have done more involved Kettle projects you&#8217;ll know how valuable the Javascript step is.  It&#8217;s the Swiss Army knife of Kettle development.  The calculator step is a nice thought, but the limited set of functions and the constriction of having to enter it in pulldowns can make more complex calculations more difficult.</p>
<p>Those that have done &#8220;observed metric&#8221; type calculations in Kettle will know this bit of Javascript well:</p>
<blockquote><p>var prevRow;<br />
var PREV_ORDER_DATE;</p>
<p>if ( prevRow != null &#38;&#38; prevRow.getInteger(&#8221;customernumber&#8221;, -1) == customernumber.getInteger() )<br />
PREV_ORDER_DATE = prevRow.getDate(&#8221;orderdate&#8221;, null);<br />
else<br />
PREV_ORDER_DATE = null;</p>
<p><strong>prevRow = row.Clone();</strong></p></blockquote>
<p>This little bit of Javascript allowed you to &#8220;look forward&#8221; (or back depending on  your sorting) and calculate the difference between items:</p>
<ul>
<li>
	Watching a set of &#8220;balances&#8221; fly by and calculate the transactions (this balance - prev balance) = transaction amount<br />
	Web Page duration (next click time - this click time) = time spent viewing this web page<br />
	Order Status time (next order status time - this order status time) = Amount of time spent in this order status (warehouse waiting)</li>
</ul>
<p>In other words, lining data up and peaking ahead and backwards is a common analytic calculation.  In <a href="http://www.orafaq.com/node/55">Oracle/ANSI SQL</a>, there&#8217;s a whole set of functions  that perform these type of functions.</p>
<p>This week I committed to the Kettle 3.2x source code a step to perform the LEAD/LAG functions that I&#8217;ve had to hand write several times in Javascript.  It&#8217;s been long overdue as I told Matt I designed the step in my head two years ago and he&#8217;s been patiently waiting for me to get off my *ss and do something about it.</p>
<p>You can find more information about the step on its <a href="http://wiki.pentaho.com/display/EAI/Analytic+Query">Wiki page</a>, along with a few examples in the samples/transformations/ directory.</p>
<p>The step allows you peek N rows forward, and N rows backward over a group and grab the value and include it in the current row.  The step allows you to set the group (at which to reset the LEAD/LAG), and setup each function (Name, Subject, Type, N rows)<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301239.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301239.jpg','popup','width=595,height=290,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301239-tm.jpg" border="1" alt="200901301239" hspace="4" vspace="4" width="205" height="100" /></a><br />
Using a group field (groupseq) and LEADing/LAGing ONE row (N = 1) we can get the following dataset:<br />
<a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301238.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301238.jpg','popup','width=506,height=153,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901301238-tm.jpg" border="1" alt="200901301238" hspace="4" vspace="4" width="330" height="100" /></a><br />
Any additional calculations (such as the difference, etc) can be calculated like any other fields.</p>
<p>This was my first commit to the Kettle project, and a very cool thing happened.  I checked in the base step and in true open source fashion, Samatar (another dev) noticed, and created an icon for my step which was great since I had no idea what to make as the icon.  Additionally, hours after my first commit he had included a French translation for the step.  He and I didn&#8217;t discuss it ahead of time, or even know each other.  That&#8217;s the way open source works&#8230; well.  <img src='http://www.nicholasgoodman.com/bt/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<strong>RIP prevRow = row.clone()</strong>.  You are dead to me now.  Long live the Analytic Query step</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/01/30/the-death-of-prevrow-rowclone/feed/</wfw:commentRss>
		</item>
		<item>
		<title>select stream REAL_TIME_BI_METRIC from DATA_IN_FLIGHT</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/01/27/select-stream-real_time_bi_metric-from-data_in_flight/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/01/27/select-stream-real_time_bi_metric-from-data_in_flight/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 00:35:49 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[General BI]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=317</guid>
		<description><![CDATA[SQL is great.  There are millions of people who know it, it&#8217;s semantics are standardized (well, as much as anything is ever I suppose), and it&#8217;s a great language for interacting with data.  The folks at SQLstream have taken a core piece of the technology world, and turbocharged it for a whole new [...]]]></description>
			<content:encoded><![CDATA[<p>SQL is great.  There are millions of people who know it, it&#8217;s semantics are standardized (well, as much as anything is ever I suppose), and it&#8217;s a great language for interacting with data.  The folks at <a href="http://www.sqlstream.com/">SQLstream</a> have taken a core piece of the technology world, and turbocharged it for a whole new application: querying streams of data.  You can think of what <a href="http://www.sqlstream.com/index.html">SQLstream</a> is doing as the &#8216;calculus&#8217; of SQL - not just query results of static data in databases but query results of a stream of records flowing by.</p>
<p>Let&#8217;s consider some of the possibilities.  Remember the results aren&#8217;t a one time poll - the values will continue to be updated as the query continues.</p>
<blockquote><p>// Select the stocks Average price over the last 10 ticks<br />
select stream stock, avg(price) over (previous 10) from stock_ticker group by stock<br />
// Get the running averages for the past minute, hour, and day updated<br />
select stream stock, avg(price) over (range interval 1 minute preceding) as &#8220;AvgMinute&#8221; , avg(price) over (range interval 1 hour preceding) as &#8220;AvgHour&#8221;, avg(price) over (range interval 1 day preceding) as &#8220;AvgDay&#8221; from stock_ticker group by stock;</p></blockquote>
<p>For a variety of reasons, I haven&#8217;t posted my demo of my real time BI analytics powered by <a href="http://www.sqlstream.com/">SQLstream</a> but figured it&#8217;s about time to at least talk about it.  The demo is illustrative of a the BASIC capabilities of the <a href="http://www.sqlstream.com/Products/productsOffersRAMMS.htm">SQLstream RAMMS</a> (Relational Asynchronous Messaging Management System).  Trust me, the simple stream queries I wrote are about as trivial as possible.  The more complex the business needs the <a href="http://www.sqlstream.com/Products/productsTechSQLXMPLS.htm">fancier the SQL becomes</a>, but that&#8217;s the point where the demo turns into a real customer project.</p>
<p>You can&#8217;t see it in just the still image below, but the bars in the bar chart are &#8220;dancing&#8221; around as events are flowing from <a href="http://www.sqlstream.com/index.html">SQLstream</a>.  It&#8217;s very very cool to watch a web dashboard update with no interaction. There&#8217;s a huge data set of stock prices being INSERTed into a stream via JDBC from one application and there&#8217;s a stream select that gives a windowed &#8220;% Change&#8221; of stock price.  The application simply gets the &#8220;Stock / % Change&#8221; values over JDBC with all the complex windowing, grouping etc being done by <a href="http://www.sqlstream.com/index.html">SQLstream</a>.</p>
<p><a onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901271717.jpg','popup','width=829,height=362,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false" href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901271717.jpg"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901271717-tm.jpg" border="1" alt="200901271717" hspace="4" vspace="4" width="229" height="100" /></a></p>
<p><a href="http://www.sqlstream.com/Products/products.htm">SQLstream have announced the 2.0 release of their produc</a>t.  Some of you may be curious as to where the 1.x version of their product has been.  To date, <a href="http://www.sqlstream.com/index.html">SQLstream</a> hasn&#8217;t made much fanfare about their products.  They&#8217;ve been selling to customers, working with the <a href="http://eigenbase.org/">Eigenbase</a> foundation, and have released several versions of their product over that past few years.  I&#8217;ve had the chance to work with the 1.x series of their product and an early release candidate of their 2.x series and think it&#8217;s very very compelling.  I very much look forward to digging into the new 2.x features soon.</p>
<p>In particular, and what I continue to find most fascinating, is the new aggregation features in 2.x.  This will allow users of ROLAP type query systems (or simply companies with summary/aggregate tables they spend time updating) to keep these tables up to date throughout the day.  This is a huge win for companies that have to update summary tables from huge transaction data sets.</p>
<p>Consider a common problem batch loading window.  You load a million records / day.  You do period batch updates of your transactions throughout the day and at midnight you kick off the big huge queries to update the &#8220;Sales by Day&#8221;, &#8220;Sales by Month&#8221;, &#8220;Sales by Qtr&#8221;, &#8220;Sales by Year&#8221;, &#8220;Sales All Time&#8221; <strong>summary tables that take hours to rebuild</strong> (going against huge fact tables).  <strong>Missing the batch window means reports/business is delayed. </strong> <a href="http://www.sqlstream.com/index.html">SQLstream</a> can ease this burden.  <a href="http://www.sqlstream.com/index.html">SQLstream</a> is efficiently calculating these summaries throughout the day (period batch loads) and at midnight simply &#8220;spits out&#8221; the summary table data.  That&#8217;s a huge win for customers with a lot of data.</p>
<p>If you&#8217;re loading millions of records per day and you need to keep summaries up to date or have time sensitive BI applications you should definitely consider  <a href="http://www.sqlstream.com/index.html">SQLstream</a>.  If you&#8217;re interested in discussing real time BI or the benefits of streaming aggregation don&#8217;t hesitate to contact <a href="http://www.bayontechnologies.com/bt/aboutus.php">Bayon</a> ; we can help you prototype, evaluate and build a <a href="http://www.sqlstream.com/index.html">SQLstream</a> solution</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/01/27/select-stream-real_time_bi_metric-from-data_in_flight/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PentahoFlashChart: Basics</title>
		<link>http://www.nicholasgoodman.com/bt/blog/2009/01/08/pentahoflashchart-basics-2/</link>
		<comments>http://www.nicholasgoodman.com/bt/blog/2009/01/08/pentahoflashchart-basics-2/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 19:14:25 +0000</pubDate>
		<dc:creator>Nicholas Goodman</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.nicholasgoodman.com/bt/blog/?p=308</guid>
		<description><![CDATA[PentahoFlashChart is a component built for Pentaho 2.0.stable (or Enterprise Edition) that allows you to render flash charts in the User Console and Dashboards.  It uses the flash library &#8220;Open Flash Chart 2.0&#8221; which is an LGPL licensed SWF.  The charts are NOT available for rendering in Pentaho Reporting or Pentaho Report Designer.
Let&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/pentahoflashcharts/">PentahoFlashChart</a> is a component built for Pentaho 2.0.stable (or Enterprise Edition) that allows you to render flash charts in the User Console and Dashboards.  It uses the flash library &#8220;<a href="http://teethgrinder.co.uk/open-flash-chart-2/">Open Flash Chart 2.0</a>&#8221; which is an LGPL licensed SWF.  The charts are <strong>NOT</strong> available for rendering in Pentaho Reporting or Pentaho Report Designer.</p>
<p>Let&#8217;s first understand what we&#8217;re talking about:  Consider the following <a href="http://demo.bayontechnologies.com/pentaho/ViewAction?solution=openflashchart&#038;path=charts&#038;action=ofc_linechart.xaction&#038;userid=guest&#038;password=guest">example run</a> from Bayon&#8217;s &#8216;demo&#8217; server.</p>
<p><strong>NOTE:</strong> This demo server is not a 100% uptime server - if you don&#8217;t see anything above don&#8217;t worry.  Check back later.</p>
<p>A chart can be rendered via a URL:</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081053.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081053.jpg','popup','width=540,height=396,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081053-tm.jpg" height="100" width="136" border="1" hspace="4" vspace="4" alt="200901081053" /></a></p>
<p>via the Pentaho User Console:</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081054.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081054.jpg','popup','width=748,height=393,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081054-tm.jpg" height="100" width="190" border="1" hspace="4" vspace="4" alt="200901081054" /></a></p>
<p>via Dashboards (JSP/AJAX/CDF):</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081055.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081055.jpg','popup','width=1014,height=339,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081055-tm.jpg" height="100" width="299" border="1" hspace="4" vspace="4" alt="200901081055" /></a></p>
<p>The PentahoFlashChart component is intended to be used, like any other component, from an .xaction which is created in the Pentaho Design Studio.</p>
<p>You can follow download this example here: <a href="http://pentahoflashcharts.googlecode.com/svn/trunk/solutions/openflashchart/charts/ofc_linechart.xaction">ofc_linechart.xaction</a></p>
<p>Just like any chart or report, you have to get your data for reporting.  In this case, we&#8217;re getting a Relational data set from the Pentaho SampleData data source.</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081059.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081059.jpg','popup','width=530,height=413,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081059-tm.jpg" height="100" width="128" border="1" hspace="4" vspace="4" alt="200901081059" /></a></p>
<p>We also have a &#8220;chart template&#8221; which is an XML document VERY similar (same same but different) to the pentaho chart xml definition that defines how to build the chart.  It contains things like chart tile, chart type, etc.  The &#8220;chart template&#8221; is really where most of the &#8220;interesting&#8221; work occurs.</p>
<p><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;chart&gt;&lt;chart-type&gt;</span><span style="font-family:monospace;font-size:11pt;">LineChart</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/chart-type&gt;&lt;title&gt;</span><span style="font-family:monospace;font-size:11pt;">Line Chart&#8211;Product &#8220;1948 Porsche 356-A Roadster&#8221;</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/title&gt;&lt;x-steps&gt;</span><span style="font-family:monospace;font-size:11pt;">1000</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/x-steps&gt;&lt;x-max&gt;</span><span style="font-family:monospace;font-size:11pt;">20000</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/x-max&gt;&lt;domain-title&gt;</span><span style="font-family:monospace;font-size:11pt;">Day</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/domain-title&gt;&lt;range-title&gt;</span><span style="font-family:monospace;font-size:11pt;">Sold Price</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/range-title&gt;&lt;y-axis&gt;&lt;labels&gt;&lt;/labels&gt;&lt;y-steps&gt;</span><span style="font-family:monospace;font-size:11pt;">1000</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/y-steps&gt;&lt;y-max&gt;</span><span style="font-family:monospace;font-size:11pt;">10000</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/y-max&gt;&lt;color&gt;</span><span style="font-family:monospace;font-size:11pt;">#909090</span><span style="font-family:monospace;color:#000080;font-size:11pt;">&lt;/color&gt;&lt;/y-axis&gt;&lt;/chart&gt;</span></p>
<p>Notice that this chart template has a &lt;chart-type&gt;LineChart&lt;/chart-type&gt; which means that the component will output a LineChart in Open Flash Chart.  The full scope of the tags, and all their functioning is beyond the scope of this intro article and it should also change.  The next release of PentahoFlashChart should be 100% compatible with the Pentaho Chart XML definition.  We&#8217;ll see. <img src='http://www.nicholasgoodman.com/bt/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>This renders the flash fragment to the page, with a &#8220;callback&#8221; for the data file that has been added to the content repository.  </p>
<p>Consider installing it into Pentaho 2.0.stable and playing with it.  The sample solution comes with 11 Examples so it should be relatively easy to get going, even though it lacks good documentation.</p>
<p><a href="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081110.jpg" onclick="window.open('http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081110.jpg','popup','width=346,height=378,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"><img src="http://www.nicholasgoodman.com/bt/blog/wp-content/uploads/2009/01/200901081110-tm.jpg" height="100" width="91" border="1" hspace="4" vspace="4" alt="200901081110" /></a></p>
<p>It&#8217;s great for dashboards, and produces some great looking (if not limited) charts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicholasgoodman.com/bt/blog/2009/01/08/pentahoflashchart-basics-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
