azure table storage将数据导出为Flat或XML文件以进行SQL

时间:2013-06-09 12:00:24

标签: database azure azure-storage azure-table-storage

我正在寻找将数据从 SQL Azure Azure表存储导出到某些平面文件或XML文件的功能,以便我们可以将其导入SQL / MYSQL Server并进行数据分析。 / p>

我们每小时从text API获得大量事务(分区策略是每小时),因为Azure表存储不支持count和Sum。因此,对于数据分析,我们希望将数据导出到Flat Files并导入到SQL Server / MySQL进行分析。

问题:

  1. 如何将数据从Azure表存储导出到Flat文件的任何工具或教程?按照Patition分区并快速分区?任何示例代码或实用程序?任何经过验证的示例/教程?

  2. MS SQL和Azure Table,任何可以每小时自动提取和加载数据到SQL服务器的工具或实用程序? Microsoft在路线图上提供的任何此类产品或出口工具?

  3. 任何支持都将受到高度赞赏。

4 个答案:

答案 0 :(得分:5)

如果您正在寻找将数据从Azure表存储导出到平面文件的工具,我建议您查看Cerebrata的Azure Management Studio商业,非免费)或ClumsyLeaf's TableXplorer商业,非免费)。这两个工具都能够将数据导出为CSV和XML文件格式。

由于这两个工具都是基于GUI的,我认为您不能自动化导出过程。对于自动化,我建议你研究Cerebrata的Azure管理Cmdlet,因为它提供了一个基于PowerShell的界面,可以将数据导出为CSV或XML格式。

由于过去我与Cerebrata有联系,我只能谈论这个问题。该工具不会逐个分区导出,但如果您知道表中的所有PartitionKey值,则可以指定查询以导出每个分区的数据。

如果自动化是关键要求之一,您可以简单地编写一个每小时运行一次的控制台应用程序并提取过去一小时的数据。您可以使用.Net Storage Client库来获取数据。为此,首先定义一个派生自TableEntity类的类。如下所示:

public class CustomEntity : TableEntity
{
    public string Attribute1
    {
        get;
        set;
    }

    public string Attribute2
    {
        get;
        set;
    }

    public string AttributeN
    {
        get;
        set;
    }

    public static string GetHeaders(string delimiter)
    {
        return "\"Attribute1\"" + delimiter + "\"Attribute2\"" + delimiter + "\"AttributeN\"";
    }

    public string ToDelimited(string delimiter)
    {
        return "\"" + Attribute1 + "\"" + delimiter + "\"" + Attribute2 + "\"" + delimiter + "\"" + AttributeN + "\"";
    }
}

然后您的应用程序可以每小时查询一次表存储并将数据保存到文件中:

    DateTime currentDateTime = DateTime.UtcNow;
    //Assuming the PartitionKey follows the following strategy for naming: YYYYMMDDHH0000
    var fromPartitionKey = currentDateTime.AddHours(-1).ToString("YYYYmmDDHH0000");
    var toPartitionKey = currentDateTime.ToString("YYYYmmDDHH0000");
    var filterExpression = string.Format("PartitionKey ge '{0}' and PartitionKey lt '{1}'", fromPartitionKey, toPartitionKey);
    var tableName = "<your table name>";
    var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials("<account name>", "<account key>"), true);
    var cloudTableClient = cloudStorageAccount.CreateCloudTableClient();
    var table = cloudTableClient.GetTableReference(tableName);
    TableQuery<CustomEntity> query = new TableQuery<CustomEntity>()
    {
        FilterString = filterExpression,
    };

    var entities = table.ExecuteQuery<CustomEntity>(query).ToList();
    if (entities.Count > 0)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(CustomEntity.GetHeaders(",") + "\n");
        foreach (var entity in entities)
        {
            sb.Append(entity.ToDelimited(",") + "\n");
        }
        var fileContents = sb.ToString();
        //Now write this string to a file.
    }

至于将这些数据导入关系数据库,我很确定如果你环顾四周,你会发现许多实用程序能够做到这一点。

答案 1 :(得分:2)

要使用新的Azure功能更新此线程,免费的Microsoft维护的azcopy现在可以将Azure表存储导出到blob存储中的平面文件: https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/#copy-entities-in-an-azure-table-with-azcopy

答案 2 :(得分:1)

您可能想尝试Enzo Cloud Backup(http://bluesyntax.net/backup20.aspx)。它提供了将Azure表直接导出到SQL数据库(SQL Server或SQL Azure)的功能。您还可以调用存储过程来动态转换数据。您还可以使用云代理或随附的.NET API将其列入计划。它是商业产品,附带免费的社区版,但这个特定功能需要高级版。

答案 3 :(得分:1)

您可以使用Azure Storage Explorer。它是免费的,并得到Microsoft的支持。 浏览到适当的存储帐户,单击要导出的表存储,然后在资源管理器中查找导出选项。 Table storage export