<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Michael Rys</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/mrys/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/mrys/feed.xml</link>
    <description>Exploring Big Data and Data Lakes with U-SQL</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:19:43 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Some highlights of the Summer 2017 refreshes for Azure Data Lake Analytics and U-SQL: GZip on OUTPUT, Catalog Views, DiagnosticStream in .NET user code, Major updates to Cognitive Libraries, Tool support to create your EXTRACT statement</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/some-highlights-of-the-summer-2017-refreshes-for-azure-data-lake-analytics-and-u-sql-gzip-on-output-catalog-views-diagnosticstream-in-net-user-code-major-updates-to-cognitive-libraries-tool-supp</link>
      <pubDate>Thu, 05 Oct 2017 02:56:18 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=787</guid>
      <description><![CDATA[We have been very busy over the summer and released several refreshes whose release notes I finally...]]></description>
      <content:encoded><![CDATA[We have been very busy over the summer and released several refreshes whose <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md" target="_blank">release notes</a> I finally found time to publish on our <a href="https://blogs.msdn.microsoft.com/azuredatalake/?p=8306" target="_blank">Azure Data Lake blog</a>.

Instead of providing a detailed list, which you can find on the <a href="https://blogs.msdn.microsoft.com/azuredatalake/?p=8306" target="_blank">Azure Data Lake blog post</a> which in turn will take you to the <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md" target="_blank">detailed release notes</a> on our <a href="https://github.com/Azure/AzureDataLake/" target="_blank">Azure Data Lake GitHub site</a>, I will focus on some of my personal favorites.

While U-SQL's <code>EXTRACT</code> expression has always been able to auto-uncompress GZIP files with the <code>.gz</code> extension, we now also automatically GZIP compress files when the target of the <code>OUTPUT</code> statement is a file (or set of files) with the <code>.gz</code> extension. This feature is currently in preview, please go and <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#automatic-gzip-compression-on-output-statement-is-now-in-preview-opt-in-statement-is-provided" target="_blank">check it out</a>!

Speaking of preview, we added another option to <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#input-file-set-scales-orders-of-magnitudes-better-now-with-additional-improvements-opt-in-statements-are-provided" target="_blank">make your file set processing even faster</a> (and more is in the pipeline!). I recommend that you add the following two preview options to your script if you are operating on file sets:

<code>SET @@FeaturePreviews = "FileSetV2Dot5:on, AsyncCompilerStoreAccess:on";</code>

And another preview feature is the ability to <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#diagnosticstream-support-in-net-user-code" target="_blank">write your own diagnostic information from within your .NET/C# user code</a> directly into the Azure Data Lake storage account. If you ever wished to record  your user-defined operator's or function's runtime behavior for later analysis, or catch errors and analyze them later, this is the feature to use!

Have you ever wondered how to generate a script to manage your meta-data (e.g., delete all your test databases) or wanted to find specific meta data objects based on some predicate? I certainly have. So I am excited that we now expose <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#u-sql-adds-catalog-views" target="_blank">U-SQL catalog views</a>. They are modelled after the SQL Server catalog views, but live in the <code>usql</code> built-in schema (e.g., the catalog view for tables is called <code>usql.tables</code>). 

The recent <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#u-sql-cognitive-library-additions" target="_blank">refresh of the cognitive extension libraries</a> brought a much richer experience to the cognitive libraries! Now I can operate on text and images either directly on files, thus not run into the string and row size limits, or in rowsets (if I need to scale to millions), but I also get the information with a confidence value.

Last, but definitively not least (!) the ADL Tooling in VisualStudio also <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md#adl-tools-for-visualstudio-now-helps-you-generate-the-u-sql-extract-statement" target="_blank">simplifies generation of the EXTRACT expression for CSV-like data</a> by automatically detecting the schema, letting me adjust it and then use the generated expression in my script! This is so cool that we published a <a href="https://blogs.msdn.microsoft.com/azuredatalake/2017/08/08/create-u-sql-extract-script-automatically/" target="_blank">detailed blog post</a> on it!

There is <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_Summer/USQL_Release_Notes_2017_Summer.md" target="_blank">much more</a> than the highlights above. Also stay tuned for the October refresh, which will contain some additional cool and long awaited features!]]></content:encoded>
    </item>
    <item>
      <title>Some highlights of the March and April 2017 U-SQL refreshs: PIVOT/UNPIVOT, Sharing across ADLA accounts, U-SQL Packages, fast file sets, new default numbers of HASH DISTRIBUTION buckets, easier C# integration with CROSS APPLY</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/some-highlights-of-the-march-and-april-2017-u-sql-refreshs-pivotunpivot-sharing-across-adla-accounts-u-sql-packages-fast-file-sets-new-default-numbers-of-hash-distribution-buckets-easier-c-int</link>
      <pubDate>Thu, 27 Apr 2017 02:00:22 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=785</guid>
      <description><![CDATA[The last two Azure Data Lake refreshs in March and April brought a lot of interesting new...]]></description>
      <content:encoded><![CDATA[The last two Azure Data Lake refreshs in <a href="https://blogs.msdn.microsoft.com/azuredatalake/2017/03/16/azure-data-lake-u-sql-march-9-2017-updates-deprecations-turn-into-errors-pivotunpivot-cross-adls-account-u-sql-catalog-sharing-nuget-packages-and-more/" target="_blank">March</a> and April brought a lot of interesting new capabilities in U-SQL. 

You can find the details by following the two links to our <a href="https://blogs.msdn.microsoft.com/azuredatalake/" target="_blank">Azure Data Lake blog</a> posts above which in turn will take you to the <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/README.md" target="_blank">detailed release notes</a> on our <a href="https://github.com/Azure/AzureDataLake/" target="_blank">Azure Data Lake GitHub site</a>.

In this post I would like to call out some of the highlights.

Based on popular customer demand and frequent questions, we added <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_03_09/USQL_Release_Notes_2017_03_09.md#u-sql-added-pivotunpivot-support" target="_blank"><code>PIVOT</code> and <code>UNPIVOT</code> expressions</a>. Like in SQL Server, they need a static list of values to pivot on. But unlike SQL Server, <code>UNPIVOT</code> also provides you with the <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md#u-sqls-unpivot-allows-explicit-inclusion-and-exclusion-of-null-values" target="_blank">ability to include rows that have <code>null</code> values</a>! If you need a more dynamic pivot, we still recommend that you use a <code>SqlMap</code> typed column for the "unknown" columns.

The March refresh also <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_03_09/USQL_Release_Notes_2017_03_09.md#catalogs-can-be-shared-among-adla-accounts-even-across-different-primary-adls-accounts" target="_blank">added the ability to access U-SQL Catalog objects such as tables and assemblies across different Azure Data Lake Analytics accounts</a>. The only requirement is that they share the same Azure Active Directory context. This for example allows you to set up a global ADLA and ADLS account that contains files and U-SQL databases in one subscription and then give different teams read and execute access to the objects from their own ADLA accounts in their own subscription. These ADLA accounts in turn have their own default ADLS accounts so team specific objects are written (and billed) into the team specific store. 

<a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md#u-sql-adds-the-notion-of-packages" target="_blank">U-SQL packages</a> are a way to package up more complex assembly references, variable declarations and resource deployments so a script writer can import a single package and get all the references and variable declarations in a single statement. It also allows developers to provide an abstraction to the script writers behind which they can refactor their assembly structures without impact on the scripts.

<a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_03_09/USQL_Release_Notes_2017_03_09.md#u-sqls-crossouter-apply-adds-support-for-values-expression-and-c-expressions-of-types-ienumerablet-keyvaluepairkv-ienumerabletuple" target="_blank">The easier C# integration with CROSS APPLY</a> should make it easier to use the CROSS APPLY with simple set-based C# expressions without the need to have to use a custom applier or wrap everything into a <code>SqlMap</code> or <code>SqlArray</code> data type.

One problem we noticed with U-SQL tables was that a lot of people just used the <code>HASH</code> distribution scheme without specifying an explicit number of hash buckets. This often lead to over- or under-partitioning of the table which negatively impacted the performance experience when loading or querying such tables. Therefore, we introduced in April a <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md#improved-data-size-dependent-selection-for-default-numbers-of-hash-distribution-buckets" target="_blank">new algorithm to determine the number of hash buckets</a> on the first insertion into a table (or table partition). The goal is to get a more optimal distribution size with better out-of-the-box performance experience.

Speaking of performance experience: We now also <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md#input-file-set-scales-orders-of-magnitudes-better-opt-in-statement-is-now-provided" target="_blank">explain how to enable the preview of faster, more scalable file sets</a>! If you use file sets in your U-SQL queries, there is <b>no reason not to try it</b>! If you do please report back here in the comments or through other channels (<a href="https://twitter.com/MikeDoesBigData" target="_blank">twitter</a>, email etc) how it works for you!

For more details and many more features and updates please review the summaries on our <a href="https://blogs.msdn.microsoft.com/azuredatalake/tag/u-sql-announcements/" target="_blank">Azure Data Lake blog</a> and finally go into the details on the <a href="https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/README.md" target="_blank">release notes</a> themselves!<a href="https://blogs.msdn.microsoft.com/azuredatalake/2017/04/27/azure-data-lake-u-sql-april-25-2017-updates-introducing-packages-unpivot-include-nulls-fast-file-set-preview-flag-r-extension-returns-dataframes-exporting-your-cluster-database-with-sample-data-t/" target="_blank">April</a>]]></content:encoded>
    </item>
    <item>
      <title>February Azure Data Lake Refresh will complete deprecation for old "PARTITION BY BUCKET" and credential DDL syntax in U-SQL</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/february-azure-data-lake-refresh-will-complete-deprecation-for-old-partition-by-bucket-and-credential-ddl-syntax-in-u-sql</link>
      <pubDate>Tue, 24 Jan 2017 18:07:15 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=775</guid>
      <description><![CDATA[In the upcoming February refresh, we will be turning some deprecation warnings into errors. Please...]]></description>
      <content:encoded><![CDATA[In the upcoming February refresh, we will be turning some deprecation warnings into errors. Please make sure that you and your customers are aware of the changes and are updating your scripts if necessary. Note that none of these changes should affect jobs that are running already created tables or external data source queries. But it will impact scripts that you use to create the objects.

The first one is that the <code>PARTITION BY BUCKET </code>syntax in the <code>CREATE TABLE </code>statements gets removed and replaced by <code>PARTITION BY </code>only. See <a href="https://blogs.msdn.microsoft.com/azuredatalake/2017/01/23/u-sql-deprecation-notice-partition-by-bucket-will-be-removed/" target="_blank">https://blogs.msdn.microsoft.com/azuredatalake/2017/01/23/u-sql-deprecation-notice-partition-by-bucket-will-be-removed/</a>.

The second one is that we are removing CREATE/ALTER/DROP CREDENTIAL statements. They are replaced by the equivalent Powershell commands. See .<a href="https://blogs.msdn.microsoft.com/azuredatalake/2017/01/24/u-sql-deprecation-update-migration-of-data-source-credentials-and-removal-of-create-credential-alter-credential-and-drop-credential/" target="_blank">https://blogs.msdn.microsoft.com/azuredatalake/2017/01/24/u-sql-deprecation-update-migration-of-data-source-credentials-and-removal-of-create-credential-alter-credential-and-drop-credential/</a> for details.]]></content:encoded>
    </item>
    <item>
      <title>How to deal with files containing rows with different column counts in U-SQL: Introducing a Flexible Schema Extractor</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/how-to-deal-with-files-containing-rows-with-different-column-counts-in-u-sql-introducing-a-flexible-schema-extractor</link>
      <pubDate>Mon, 15 Aug 2016 08:25:41 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=766</guid>
      <description><![CDATA[If your input data is not rectangular in nature, but contains rows with different column counts, the...]]></description>
      <content:encoded><![CDATA[If your input data is not rectangular in nature, but contains rows with different column counts, the built-in U-SQL extractors will not be able to parse the data. Instead, you should write a custom extractor.

In this blog post we will take a look at a flexible schema extractor that is able to read a row-oriented file that has different column counts by filling missing columns with null values. If you don't know the full schema for all rows a priori, it also allows you to fill a SqlMap column with the data that does not fit into the provided columns.

<h2>Example Scenario</h2>
Let's introduce a simple scenario with some sample data. Assume that the file <a href="https://github.com/Azure/usql/blob/master/Examples/Samples/Blogs/MRys/FlexExtractor/OrderData.csv" target="_blank"><code>/Samples/Blogs/MRys/FlexExtractor/OrderData.csv</code></a> contains the order of different products where only the first 4 columns are fixed as order ID, product type, ordered amount and per item price. All remaining columns both in their number and semantics depend upon the product type:

<pre>1,Shoes,2,99.99,10
1,Pants,3,59,34,32
2,Camera,1,999.00,Canon,70D
2,Lens,1,999.99,Canon,100mm.Macro,1.4
2,Lens,1,459.99,Sigma,28-85mm,Macro/Zoom,2.8
3,Camera,1,745,Sony,RX-100-II
3,Shoes,1,69.99,13</pre>

For example, the Camera product type has the camera make and model as additional columns, whereas the Lens product type provides additional columns providing the make, the focal length, lens type and the aperture setting.

<h2>Writing scripts to extract data</h2>
Let's write one script that does schematize all possible columns and then produces one file for each of the product types. A naive approach may create an extractor per product type (or a generic extractor that takes the product type as an argument), but that would mean that the file has to be read once for every product type. Obviously, you would want to avoid such costly reads if there is a lot of data with many product types. Instead, we will parse the file once and produce a single rowset that then will be filtered in subsequent SELECT statements.

Since the additional flexible columns are different across different product types, or not existing for some product types, the extract statement will handle the flexible columns in a generic way (as strings) and the "typing" SELECT statements will give the values their type specific semantics.

With this information, we can generate the following script:

<pre>
DECLARE @input string = "/Samples/Blogs/MRys/FlexExtractor/OrderData.csv";

// Usage with all columns known
@data = EXTRACT orderid int, producttype string, orderamount int, itemprice decimal,
                c1 string, c2 string, c3 string, c4 string
        FROM @input
        USING new FlexibleSchemaExtractor.FlexExtractor();

// product type Camera
@cameras =
    SELECT orderid,
           orderamount,
           itemprice,
           c1 AS make,
           c2 AS model
    FROM @data
    WHERE producttype == "Camera";

OUTPUT @cameras
TO "/output/cameras.csv"
USING Outputters.Csv();

// product type Lens
@lenses =
    SELECT orderid,
           orderamount,
           itemprice,
           c1 AS make,
           c2 AS focallength,
           c3 AS lenstype,
           c4 == null ? (decimal?) null : Decimal.Parse(c4) AS aperture
    FROM @data
    WHERE producttype == "Lens";

OUTPUT @lenses
TO "/output/lenses.csv"
USING Outputters.Csv();
</pre>

Note that the extract knows how to schematize the common columns, and then uses a generic naming and typing scheme for the rest, providing as many additional columns as the most complex product type provides.

<h2>Writing the Flexible Schema Extractor UDO</h2>

Now we need to implement the extractor:

<pre>
using Microsoft.Analytics.Interfaces;
using Microsoft.Analytics.Types.Sql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FlexibleSchemaExtractor
{
    public class FlexExtractor : IExtractor
    {
        private Encoding _encoding;
        private byte[] _row_delim;
        private string _col_delim;

        public FlexExtractor(Encoding encoding = null, string row_delim = "\r\n", string col_delim = ",")
        {
            this._encoding = ((encoding == null) ? Encoding.UTF8 : encoding);
            this._row_delim = this._encoding.GetBytes(row_delim);
            this._col_delim = col_delim;
        }

        public override IEnumerable&lt;IRow&gt; Extract(IUnstructuredReader input, IUpdatableRow output)
        {
            var colsInSchema = output.Schema.Count;

            // let's check global assumptions
            // - first 4 provided columns are int, string, int, decimal.

            if (   output.Schema[0].Type != typeof(System.Int32) 
                || output.Schema[1].Type != typeof(System.String)
                || output.Schema[2].Type != typeof(System.Int32)
                || output.Schema[3].Type != typeof(System.Decimal)
               )
            {
                throw new Exception("First 4 columns are not of expected types int32, string, int32, decimal.");
            }

            foreach (Stream currentline in input.Split(this._row_delim))
            {
                using (StreamReader lineReader = new StreamReader(currentline, this._encoding))
                {
                    string[] columns = lineReader.ReadToEnd().Split( new string[] { this._col_delim }
                                                                   , StringSplitOptions.None);
                    var colsInData = columns.Length;

                    // let's check row level assumptions
                    // - if less columns are specified, then last column needs to be of type SqlMap&lt;Int32, string&gt;

                    if (   colsInData &gt; colsInSchema 
                        &amp;&amp; output.Schema[colsInSchema - 1].Type != typeof(SqlMap&lt;Int32, string&gt;))
                    {
                        throw new Exception(
                              "Too many columns detected and last column is not of type SqlMap&lt;Int32,string&gt;. " 
                            + "Add a final column of type SqlMap&lt;Int32,string&amp;ht; into your extract schema.");
                    }
                    // Set first 4 fixed columns
                    output.Set&lt;Int32&gt;(0, Int32.Parse(columns[0]));
                    output.Set&lt;String&gt;(1, columns[1]);
                    output.Set&lt;Int32&gt;(2, Int32.Parse(columns[2]));
                    output.Set&lt;Decimal&gt;(3, Decimal.Parse(columns[3]));

                    // Fill all remaining columns except the last which may be a map
                    for (int i = 4; i &lt; Math.Min(colsInData, colsInSchema) - 1; i++)
                    {
                        output.Set&lt;String&gt;(i, columns[i]);
                    }

                    // Now handle last column: if it is a map
                    if (   colsInData &gt;= colsInSchema 
                        &amp;&amp; output.Schema[colsInSchema - 1].Type == typeof(SqlMap&lt;Int32,string&gt;))
                    {
                        var sqlmap = new Dictionary&lt;Int32,string&gt;();
                        for (int j = colsInSchema - 1; j &lt; colsInData; j++)
                        {
                            sqlmap.Add(j - colsInSchema + 1, columns[j]);
                        }
                        output.Set&lt;SqlMap&lt;Int32,string&gt;&gt;(colsInSchema - 1, new SqlMap&lt;Int32,string&gt;(sqlmap));
                    }
                    // Now handle last column: if it is not a map
                    else if (colsInData == Math.Min(colsInData, colsInSchema))
                    {
                        output.Set&lt;string&gt;(colsInData - 1, columns[colsInData - 1]);
                    }

                    yield return output.AsReadOnly();
                }
            }
        }
    }
}
</pre>

As you can see, the extractor code is fairly simple. The only noteworthy special processing handles the last column that may be a <code>SqlMap&lt;Int32,string&gt;</code> if we do not know all the columns ahead of the query.

<h2>Extracting Flexible columns with a SqlMap</h2>

The extractor allows to use a final column of type <code>SqlMap&lt;Int32,string&gt;</code> in the following way (<code>@input</code> is defined as above):

<pre>
@data = EXTRACT orderid int, producttype string, orderamount int, itemprice decimal,
                c1 string, map SqlMap&lt;Int32,string&gt;
        FROM @input
        USING new FlexibleSchemaExtractor.FlexExtractor();

// product type Camera
@cameras =
    SELECT orderid,
           orderamount,
           itemprice,
           c1 AS make,
           map[0] AS model
    FROM @data
    WHERE producttype == "Camera";

OUTPUT @cameras
TO "/output/cameras2.csv"
USING Outputters.Csv();

// product type Lens
@lenses =
    SELECT orderid,
           orderamount,
           itemprice,
           c1 AS make,
           map[0] AS focallength,
           map[1] AS lenstype,
           map[2] == null ? (decimal?) null : Decimal.Parse(map[2]) AS aperture
    FROM @data
    WHERE producttype == "Lens";

OUTPUT @lenses
TO "/output/lenses2.csv"
USING Outputters.Csv();

// remaining product types (serialize map generically)
@others =
    SELECT orderid,
           producttype,
           orderamount,
           itemprice,
           c1,
           map == null ? (string) null 
                       : string.Join(" ; ", 
                                     from p in map 
                                     select string.Format("{0}{1}{2}", p.Key, " : ", p.Value)) AS map 
    FROM @data
    WHERE producttype NOT IN ("Camera", "Lens");

OUTPUT @others
TO "/users/herring/others.csv"
USING Outputters.Csv();
</pre>

Note that the <code>@others</code> expression is serializing the map with a C# expression so we can use the built-in outputter.

<h2>Conclusion</h2>
In this post I showed how easy it is to handle more complex file formats with flexible schema formats. You can find the <a href="https://github.com/Azure/usql/blob/master/Examples/Samples/Blogs/MRys/FlexExtractor/OrderData.csv" target="_blank">sample data</a> and the <a href="https://github.com/Azure/usql/tree/master/Examples/FlexibleSchemaExtractor" target="_blank">sample project</a> on the <a href="https://github.com/Azure/usql" target="_blank">Azure U-SQL Github repository</a>.

Please leave your feedback and questions in the comments below.]]></content:encoded>
    </item>
    <item>
      <title>Some highlights of the August 1st U-SQL refresh: Skipping header rows, Database Level ACLs, improved Extractor framework</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/some-highlights-of-the-august-1st-u-sql-refresh-skipping-header-rows-database-level-acls-improved-extractor-framework</link>
      <pubDate>Wed, 03 Aug 2016 22:44:12 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=765</guid>
      <description><![CDATA[We just released some big updates on U-SQL and Azure Data Lake. 

Check out the U-SQL release...]]></description>
      <content:encoded><![CDATA[We just released some big updates on U-SQL and Azure Data Lake. 

Check out the <a href="https://blogs.msdn.microsoft.com/azuredatalake/2016/08/03/azure-data-lake-u-sql-august-1st-2016-updates-acls-on-databases-skipping-header-rows-sampling-and-more/" target="_blank">U-SQL release notes</a> and the <a href="https://blogs.msdn.microsoft.com/azuredatalake/2016/07/31/introducing-file-and-folder-acls-for-azure-data-lake-store/" target="_blank">blog post summarizing the new file and folder-level access control in Azure Data Lake Storage</a>.

In this blog post I want to call out some of the highlights.

First we released access control at the database level. This gives you now control on who can create databases, and use them to read from them or use them to create objects in them. Note that the master database in U-SQL per default continues to be open for everyone to use.

Secondly, we fixed the so-called record boundary-extent boundary alignment issue that causes large files to fail during extraction unless they were uploaded in specific ways. Fixing this issue also gives us now correct information about the segments (extents) that are being passed to an extractor. Which in turn now allows us to finally enable the skipFirstNRows parameter on the built-in extractors as well as write parallelizable custom extractors that process the first or last file segment specially. I will provide some more detailed blog posts on such custom extractors soon.

Finally, I strongly suggest to sign up to test the new sampling capabilities.]]></content:encoded>
    </item>
    <item>
      <title>How do I combine overlapping ranges using U-SQL? Introducing U-SQL Reducer UDOs</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/how-do-i-combine-overlapping-ranges-using-u-sql-introducing-u-sql-reducer-udos</link>
      <pubDate>Wed, 08 Jun 2016 00:53:33 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=745</guid>
      <description><![CDATA[The problem statement
A few weeks ago, a customer on stackoverflow asked for a solution for the...]]></description>
      <content:encoded><![CDATA[<h2>The problem statement</h2>
A few weeks ago, a customer on <a href="https://stackoverflow.com/questions/35624870/azure-data-lake-analytics-combine-overlapping-time-duration-using-u-sql/" target="_blank">stackoverflow </a>asked for a solution for the following problem:
<blockquote>Given a log file that contains time ranges in the form (begin, end) for a user-name, I would like to merge overlapping ranges for each user.</blockquote>
At the time I promised to provide a solution using a custom reducer, but got busy with a lot of other work items and some vacation. But now I will fulfill the promise.

First let's look at the sample data provided in the stackoverflow post with some augmentation:
<pre>Start Time - End Time - User Name
5:00 AM - 6:00 AM - ABC
5:00 AM - 6:00 AM - XYZ
8:00 AM - 9:00 AM - ABC
8:00 AM - 10:00 AM - ABC
10:00 AM - 2:00 PM - ABC
7:00 AM - 11:00 AM - ABC
9:00 AM - 11:00 AM - ABC
11:00 AM - 11:30 AM - ABC
11:40 PM - 11:59 PM - FOO
11:50 PM - 0:40 AM - FOO</pre>
After combining the ranges, the expected result should look similar to:
<pre>Start Time - End Time - User Name
5:00 AM - 6:00 AM - ABC
5:00 AM - 6:00 AM - XYZ
7:00 AM - 2:00 PM - ABC
11:40 PM - 0:40 AM - FOO</pre>
For the purpose of this post, I placed a <a href="https://github.com/Azure/usql/blob/master/Examples/Samples/Blogs/MRys/Ranges/ranges.txt" target="_blank">sample input file <code>/Samples/Blogs/MRys/Ranges/ranges.txt</code></a> onto our U-SQL github repository.
<h2>Analysis of the problem and possible solution</h2>
If you look at the problem, you will at first notice that you want to define something like a user-defined aggregation to combine the overlapping time intervals. However, if you look at the input data, you will notice that since the data is not ordered, you will either have to maintain the state for all possible intervals and then merge disjoint intervals as bridging intervals appear, or you need to preorder the intervals for each user name to make the merging of the intervals easier.

The ordered aggregation is simpler to scale out, but U-SQL does not provide ordered user-defined aggregators (UDAGGs) yet. In addition, UDAGGs normally produce one row per group, while in this case, I may have multiple rows per group if the ranges are disjoint.

Luckily, U-SQL provides a scalable user-defined operator called a <strong><a href="https://msdn.microsoft.com/en-US/library/azure/mt621336.aspx" target="_blank">reducer</a></strong> which gives us the ability to aggregate a set of rows based on a grouping key set using custom code.

So my first script outline would look something like the following code where <code>ReduceSample.RangeReducer</code> is my user-defined reducer (Reducer UDO):
<pre>@in = EXTRACT begin DateTime, end DateTime, user string
FROM "/Samples/Blogs/MRys/Ranges/ranges.txt"
USING Extractors.Text(delimiter:'-');

@r = REDUCE @in ON user
PRODUCE begin DateTime, end DateTime, user string
USING new ReduceSample.RangeReducer();

OUTPUT @r
TO "/temp/result.csv"
USING Outputters.Csv();
</pre>
So now the questions are: how can I sort the rows in each group to perform the range reduction and how does my reducer look like.
<h2>First attempt at writing the range reducer</h2>
The way to write a reducer is to implement an instance of <code>Microsoft.Analytics.Interfaces.IReducer</code>. In this case, since we do not need to provide any parameters, we only need to overwrite the abstract <code>Reduce</code> method as follows:
<pre>using Microsoft.Analytics.Interfaces;
using Microsoft.Analytics.Types.Sql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReduceSample
{
    public class RangeReducer : IReducer
    {
        <strong>public override IEnumerable&lt;IRow&gt; Reduce(IRowset input, IUpdatableRow output)
        {
         // Insert your code to reduce
        } // Reduce</strong>
    } // RangeReducer
} // ReduceSample
</pre>
The U-SQL <code>REDUCE</code> expression will apply the Reduce method once for each group in parallel. The <code>input</code> parameter thus will only contain the rows for a given group and the implementation can return zero to N rows as output.

Therefore, the implementation of the method can concentrate on just doing the reduction on each group. So how can we get each group sorted? The first thought is, to just take the <code>input</code> rowset and sort it and then iterate over it:
<pre>public override IEnumerable&lt;IRow&gt; Reduce(IRowset input, IUpdatableRow output)
{
  <strong>foreach (var row in input.Rows.OrderBy(x =&gt; x.Get&lt;DateTime&gt;("begin")))
  {
   // perform the range merging
  } // foreach</strong>
} // Reduce
</pre>
However, this approach will run into the following error message:
<pre>E_RUNTIME_USER_UNHANDLED_EXCEPTION_FROM_USER_CODE
An unhandled exception from user code has been reported.
Unhandled exception from user code: "Access an expired row using Get method, column: begin, index: 0. Please clone row when iterating row set"
</pre>
because the UDO's <code>IRowset</code> is implemented as a forward-only streaming API, that does not support accessing a row again after accessing the next row and the LINQ's <code>OrderBy</code> will need to see the values of at least two rows to be able to sort them.
<h2>The final version of the range reducer</h2>
Fortunately, U-SQL's <code>REDUCE</code> expression provides an option to pre-sort the rows before they are being passed to the <code>Reduce</code> method using the <code>PRESORT</code> clause (which just recently got released and at the time of the writing of this blog has not been documented in the reference documentation yet). When adding the <code>PRESORT</code> clause, the rows in the <code>input</code> rowset are now guaranteed to be ordered.

So now we can focus on implementing the actual range merge logic (refer to the comments in the code for the explanation of the code):
<pre>public override IEnumerable&lt;IRow&gt; Reduce(IRowset input, IUpdatableRow output)
{
  // Init aggregation values
  int i = 0;
  var begin = DateTime.MaxValue; // Dummy value to make compiler happy
  var end = DateTime.MinValue; // Dummy value to make compiler happy

  // requires that the reducer is PRESORTED on begin and READONLY on the reduce key.
  foreach (var row in input.Rows)
  {
    // Initialize the first interval with the first row if i is 0
    if (i == 0)
    {
      i++; // mark that we handled the first row
      begin = row.Get&lt;DateTime&gt;("begin");
      end = row.Get&lt;DateTime&gt;("end");
      // If the end is just a time and not a date, it can be earlier than the begin, indicating it is on the next day.
      // This let's fix up the end to the next day in that case
      if (end &lt; begin) { end = end.AddDays(1); }
    }
    else // handle the remaining rows
    {
      var b = row.Get&lt;DateTime&gt;("begin");
      var e = row.Get&lt;DateTime&gt;("end");
      // fix up the date if end is earlier than begin
      if (e &lt; b) { e = e.AddDays(1); }

      // if the begin is still inside the interval, increase the interval if it is longer
      if (b &lt;= end)
      {
        // if the new end time is later than the current, extend the interval
        if (e &gt; end) { end = e; }
      }
      else // output the previous interval and start a new one
      {
        output.Set&lt;DateTime&gt;("begin", begin);
        output.Set&lt;DateTime&gt;("end", end);
        yield return output.AsReadOnly();
        begin = b; end = e;
      } // if
    } // if
  } // foreach

  // now output the last interval
  output.Set&lt;DateTime&gt;("begin", begin);
  output.Set&lt;DateTime&gt;("end", end);
  yield return output.AsReadOnly();
} // Reduce
</pre>
You may notice that the code is not doing anything with the grouping key. One of the features of UDO model is, that if you specify in the U-SQL UDO expression that a column is <code>READONLY</code>, the column will be passed through automatically and you can write your UDO code more generic by focusing just on the columns you want to transform.

Now that we have written the reducer, we have to go back to our U-SQL script and add the <code>PRESORT</code> and <code>READONLY</code> clauses:
<pre>@in = EXTRACT begin DateTime, end DateTime, user string
FROM "/Samples/Blogs/MRys/Ranges/ranges.txt"
USING Extractors.Text(delimiter:'-');

@r = REDUCE @in <strong>PRESORT begin</strong> ON user
PRODUCE begin DateTime, end DateTime, user string
<strong>READONLY user</strong>
USING new ReduceSample.RangeReducer();

OUTPUT @r
TO "/temp/result.csv"
USING Outputters.Csv();
</pre>
<h2>Final note: Recursive vs non-recursive reducers</h2>
If you now apply the above reducer on a large set of data (the customer mentioned that his CSV files were in the GB range), and some of your grouping keys may be much more frequently appearing than others, you will encounter something that is normally called data skew. Such data skew in the best case can lead to some reducers taking much longer than others, and in the worst case can lead to some reducers running out of the available memory and time resources (a vertex will time-out after running for about 5 hours). If the reducer semantics is associative and commutative and its output schema is the same as its input schema, then a reducer can be marked as <strong>recursive</strong> which allows the query engine to split large groups into smaller sub-groups and recursively apply the reducer on these subgroups to calculate the final result. A reducer is marked as recursive by using the following property annotation:
<pre>namespace ReduceSample
{
    <strong>[SqlUserDefinedReducer(IsRecursive = true)]</strong>
    public class RangeReducer : IReducer
    {
        public override IEnumerable&lt;IRow&gt; Reduce(IRowset input, IUpdatableRow output)
        {
         // Insert your code to reduce
        } // Reduce
    } // RangeReducer
} // ReduceSample

</pre>
In our case, assuming the processing will preserve the sort among the rows in each recursive invocation, can be marked as recursive to improve scalability and performance.

You can find a <a href="https://github.com/Azure/usql/tree/master/Examples/RangeReducer" target="_blank">VisualStudio project</a> of the example on our github repository.]]></content:encoded>
    </item>
    <item>
      <title>I am back on my MSDN blog talking about Big Data, Azure Data Lake and U-SQL</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/i-am-back-on-my-msdn-blog-talking-about-big-data-azure-data-lake-and-u-sql</link>
      <pubDate>Tue, 07 Jun 2016 21:14:18 GMT</pubDate>
      <dc:creator><![CDATA[MRys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/?p=736</guid>
      <description><![CDATA[Hi all

It has been several years since I last blogged on my MSDN blog. Partially because I have...]]></description>
      <content:encoded><![CDATA[Hi all

It has been several years since I last blogged on my MSDN blog. Partially because I have been working on things I could not really blog about, partially because the many changes to the blogging infrastructure lost my log-in account connection. Now I got it back, as - as some of you probably have noticed - I am now working on <a href="https://usql.io" target="_blank">U-SQL</a>, our new highly-scalable, easy to extend Big Data Query language in the <a href="https://azure.com/datalake" target="_blank">Azure Data Lake</a>. Here are some links to the VS blog and MSDN Magazine articles I have authored on it:
<ul>
	<li><a href="https://blogs.msdn.microsoft.com/visualstudio/2015/09/28/introducing-u-sql-a-language-that-makes-big-data-processing-easy/" rel="bookmark">Introducing U-SQL – A Language that makes Big Data Processing Easy</a></li>
	<li><a href="https://blogs.msdn.microsoft.com/visualstudio/2015/10/28/writing-and-using-custom-code-in-u-sql-user-defined-functions/" rel="bookmark">Writing and Using Custom Code in U-SQL – User-Defined Functions</a></li>
	<li><a href="https://msdn.microsoft.com/en-us/magazine/mt614251.aspx">Big Data - Making Big Data Batch Analytics Easier Using U-SQL</a></li>
</ul>
And you can find my presentations on U-SQL (and some older SQL Server related presentations as well) on <a href="https://www.slideshare.net/MichaelRys" target="_blank">slideshare.net</a>.

Other resources are:
<ul>
	<li><a href="https://aka.ms/adlfeedback" target="_blank">ADL and U-SQL feedback and feature wishes</a></li>
	<li><a href="https://social.msdn.microsoft.com/forums/azure/en-US/home?forum=AzureDataLake" target="_blank">ADLA and U-SQL MSDN Forum</a></li>
	<li><a href="https://stackoverflow.com/questions/tagged/u-sql" target="_blank">U-SQL related questions on stackoverflow</a></li>
	<li><a href="https://github.com/Azure/usql" target="_blank">The U-SQL Github site that contains many of the samples</a></li>
	<li><a href="https://aka.ms/usql_reference" target="_blank">U-SQL Reference documentation</a></li>
	<li><a href="https://twitter.com/MikeDoesBigData" target="_blank">My tweet stream</a> (use #USQL to tweet about U-SQL since Twitter doesn't handle '-' in tags well)</li>
	<li>And last but not least the <a href="https://blogs.msdn.microsoft.com/azuredatalake/" target="_blank">Big Data team blog</a> (where I will move some of the blog posts that I develop here on U-SQL and ADLA).</li>
</ul>
So how am I going to use this personal blog? I will be blogging here more personal opinions on the data processing industry and the concepts, write adhoc, shorter blogs reacting to tweets, customers questions and requests and author draft postings that I will move over to the team blog.

Please let me know if you have questions and suggestions on things you want me to talk about.]]></content:encoded>
    </item>
    <item>
      <title>Update on SQL PASS 2007 Presentations</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/update-on-sql-pass-2007-presentations</link>
      <pubDate>Wed, 19 Sep 2007 00:34:00 GMT</pubDate>
      <dc:creator><![CDATA[mrys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/2007/09/19/update-on-sql-pass-2007-presentations/</guid>
      <description><![CDATA[I am giving 3 presentations at SQL PASS 2007 in Denver: 
Wednesday, September 19th, 9:45am to 11am,...]]></description>
      <content:encoded><![CDATA[<P>I am giving 3 presentations at <A href="https://www.sqlpass.org/summit/Pages/default.aspx">SQL PASS 2007</A> in Denver: </P>
<P><B>Wednesday, September 19th, 9:45am to 11am, room 709:</B><BR><I><B>DBA-317-M The Next Release of Microsoft SQL Server: Beyond Relational</B></I><BR>(co-presenting with Kevin Farlee) <BR>Main focus will be the new features in the areas of unstructured and semistructured data management in SQL Server 2008. </P>
<P><B>Wednesday, September 19th, 1:30pm to 2:45pm, room 709:</B><BR><I><B>AD-407-M Deep Dive into XQuery and XML in Microsoft SQL Server: Common Problems &amp; Best Practice Solutions </B></I><BR>This is the same presentation I gave at <A href="https://blogs.msdn.com/WebLog/mrys/archive/2007/06/04/35179.aspx" mce_href="https://blogs.msdn.com/WebLog/mrys/archive/2007/06/04/35179.aspx">TechEd 2007</A>, a bit shortened to fit into the timeslot. Focus is on SQL Server 2005 XQuery and XML optimizations, however they also will apply to SQL Server 2008. </P>
<P><B>Thursday, September 20th, 1:30pm to 2:45pm, room 709:</B><BR><I><B>AD-312-M Building Spatial Application with Microsoft SQL Server</B></I><BR>(co-presenting with Isaac Kunen) <BR>This will be an updated presentation of the chalktalk that I gave at <A href="https://blogs.msdn.com/WebLog/mrys/archive/2007/06/04/35179.aspx" mce_href="https://blogs.msdn.com/WebLog/mrys/archive/2007/06/04/35179.aspx">TechEd 2007</A>. Main focus is that the demo runs now on the bits that will be shipping :). </P>
<P>We merged the Friday 4pm presentation on managing unstructured and semistructured data (AD-313-M) with the presentation on "Beyond Relational" that Kevin and I will give on Wednesday. Primarily because the two presentations had a large overlap and neither Shan nor Srini were able to attend.</P>]]></content:encoded>
    </item>
    <item>
      <title>SQL Server 2008 June CTP has been annouced at TechEd 2007</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/sql-server-2008-june-ctp-has-been-annouced-at-teched-2007</link>
      <pubDate>Mon, 04 Jun 2007 12:31:00 GMT</pubDate>
      <dc:creator><![CDATA[mrys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/2007/06/04/sql-server-2008-june-ctp-has-been-annouced-at-teched-2007/</guid>
      <description><![CDATA[At today's TechEd 2007 in Orlando, we have annouced SQL Server 2008's, formerly known as Katmai,...]]></description>
      <content:encoded><![CDATA[<P>At today's <A class="" href="https://www.microsoft.com/events/teched2007/default.mspx" target=_blank mce_href="https://www.microsoft.com/events/teched2007/default.mspx">TechEd 2007 in Orlando</A>, we have annouced SQL Server 2008's, formerly known as Katmai, first community tech preview (CTP). Unlike SQL Server 2005, where we took over 5 years, SQL Server 2008 will be delivered in less than 3! <A class="" href="https://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5395" target=_blank mce_href="https://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5395">See here for the official scoop</A> and <A class="" href="https://connect.microsoft.com/programdetails.aspx?ProgramDetailsID=1384" target=_blank mce_href="https://connect.microsoft.com/programdetails.aspx?ProgramDetailsID=1384 ">register here</A>!</P>
<P>What does this bring for XML Support and other interesting programmability support, you may ask. Well, we are doing a bit of XML (not quiet as much as you may would have liked, but we need to also invest in other areas ;-) ), added a new MERGE statement, finally added some more usable date and time datatypes, work on adding support for spatial datatypes and indexing and a slew of other interesting, cool features.</P>
<P>I personally have been working on XML (obviously) and spatial indexing, besides being involved in one way or another with many of the programmability features, and - yes, that's the most important change for the product ;-) - the change of @@version from 9.0 to 10.0 :-).</P>
<P>I am at TechEd as well and will give the following breakout and chalk-talk presentations on XML and Spatial:</P>
<P><STRONG>Wednesday, June 6 10:15 AM - 11:30 AM, Blue Theater 12:<BR><EM>DAT11-TLC - XML Q&amp;A<BR></EM></STRONG>Speaker(s): Peter DeBetta, Michael Rys<BR>Two experts, one place to get your questions on XML in SQL Server answered. Interested in what's new in SQL Server 2008 ("Katmai"), or the new FOR XML PATH? Want to know when to use XML? How to index it? Need to know how to write an XQuery? Come to this session, and Michael and Peter will see that you get an answer.</P>
<P><STRONG>Thursday, June 7 9:45 AM - 11:00 AM, Blue Theater 12:<BR><EM>DAT17-TLC - Spatial Support in Microsoft SQL Server<BR></EM></STRONG>Speaker(s): Michael Rys, Michael Wang<BR>The next version of SQL Server will include provide support for spatial data. This chalk talk presents the new spatial datatypes and indexing mechanisms so you can fully take advantage of the new capabilities that are being offered. </P>
<P><STRONG>Friday, June 8 1:00 PM - 2:15 PM, S210 E:<BR><EM>DAT422 - Deep Dive into XQuery and XML in Microsoft SQL Server: Common Problems and Best Practice Solutions</EM></STRONG><BR>Speaker(s): Michael Rys<BR>This presentation provides a deep dive into the XML, XQuery, and XML indexing support in SQL Server 2005. It uses example scenarios that customers have come across when using XML and XQuery to show how to use optimize XQuery expressions, and provides the best practices on how to address the encountered issues.</P>
<P>Of additional interest should be the following presentations:</P>
<P><STRONG>Today, Monday, June 4 3:00 PM - 4:15 PM, S320 A:<BR><EM>DAT201 - The Next Release of Microsoft SQL Server: Overview<BR></EM></STRONG>Speaker(s): David Campbell<BR>This session provides an overview of the next release of SQL Server that is currently under development. We cover the core value-proposition, major themes and scenarios, and some specific improvements. We also cover the new development processes being used to build this release, the release timeline and the disclosure calendar.</P>
<P><STRONG>Tuesday, June 5 2:45 PM - 4:00 PM, N320 E:<BR><EM>DAT202 - The Next Release of Microsoft SQL Server: Beyond Relational&nbsp;&nbsp; <BR></EM></STRONG>Speaker(s): Shishir Mehrotra<BR>As the data your applications work with changes from “words and numbers” to “sights and sounds”, we are evolving our data platform to go beyond relational data, beyond OLAP, to truly support all of the digital data types of the future. We will strive to deliver the best platform for integrated storage, and advanced applications such as spatial data, while also making it dramatically easier for you to build data-driven applications, without needing to invest significant resources in bridging the gap between data and programming language data structures. Come learn about the new enhancements in the next release of SQL Server that will help you manage all types of data. </P>
<P><STRONG>Tuesday, June 5 4:30 PM - 5:45 PM, S210 E:<BR><EM>DAT312 - XML in Microsoft SQL Server 2005<BR></EM></STRONG>Speaker(s): Peter DeBetta<BR>XML is now a native type in SQL Server 2005. This session explores this new type, XML methods, new features for shredding and composing XML, and provides an introduction to XQuery, XPath, and some preferred practices for implementing XML, and other XML-related topics.</P>
<P><STRONG>Wednesday, June 6 3:45 PM - 5:00 PM, Blue Theater 12:<BR><EM>DAT18-TLC - Overview of New T-SQL Programmability Features in the Next Release of Microsoft SQL Server<BR></EM></STRONG>Speaker(s): Michael Wang<BR>This session offers a high level overview of all new T-SQL programmability features introduced in next release of SQL Server in terms of SQL type system, DDL, server procedure programming, supportability, and globalization.<BR>Friday, June 8 10:45 AM - 12:00 PM, Blue Theater 12:<BR>DAT06-TLC - New T-SQL System Types in Microsoft SQL Server Codename "Katmai"<BR>Speaker(s): Michael Wang<BR>This session focuses on all new T-SQL system data types introduced in next release of SQL Server.</P>
<P>I hope to see you there or at the TLC booth of SQL Server. </P>
<P>Now that we can publicly talk about "Katmai", I will be blogging more about what's new and be available to take your feedback.<BR></P>]]></content:encoded>
    </item>
    <item>
      <title>What do you want to see regarding XML support in the next version of SQL Server?</title>
      <link>https://docs.microsoft.com/archive/blogs/mrys/what-do-you-want-to-see-regarding-xml-support-in-the-next-version-of-sql-server</link>
      <pubDate>Sat, 26 Nov 2005 04:27:00 GMT</pubDate>
      <dc:creator><![CDATA[mrys]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mrys/2005/11/26/what-do-you-want-to-see-regarding-xml-support-in-the-next-version-of-sql-server/</guid>
      <description><![CDATA[Now that we have shipped SQL Server 2005, I would really like to hear from you what you want us to...]]></description>
      <content:encoded><![CDATA[<P>Now that <A href="https://sqljunkies.com/WebLog/mrys/archive/2005/11/07/17311.aspx">we have shipped SQL Server 2005</A>, I would really like to hear from you what you want us to do regarding XML support in SQL Server 2005. Feel free to either <a href="https://blogs.msdn.com/mrys/contact.aspx">contact me directly</A> or leave your wish in the comment section.</P>]]></content:encoded>
    </item>
  </channel>
</rss>