Azure SQL数据仓库是否有分割字符串的方法?

Fas*_*ous 4 sql-server data-warehouse azure-sql-database

做一些研究,我发现在Azure SQL数据仓库中拆分字符串没有很好的选择.它没有新的STRING_SPLIT()函数或OPENJSON()函数.它也不允许用户定义函数中的SELECT语句尝试创建自己的,就像社区所做的许多自定义拆分器功能一样.

因此,我想我会提出这样的问题:SQL数据仓库是否有分割字符串的方法以及最佳选择?

用例

您在SQL表中有一个字段,其值为"My_Value_Is_Good".目标是在SELECT语句中使用分隔符下划线将每个段拆分为单独的字段,或者最多写入新表.

我用过的解决方案

对我来说主要的是在数据进入数据仓库之前转换数据.我使用Python来解析数据.但是,较大的数据集确实会降低速度,并将其更多地分离到系统中的特定记录中.

wBo*_*Bob 5

与普通SQL Server或Azure SQL数据库相比,Azure SQL数据仓库具有减少的T-SQL表面积.它没有任何花哨的技巧,如STRING_SPLIT表值函数,CLR,XML; 甚至不允许使用游标.事实上,对于关于这个主题的一篇文章(pre-SQL 2016)中的所有技术' 以正确的方式拆分字符串 - 或者下一个最好的方式 ',你不能使用它们中的任何一个,除了数字表.

因此,我们需要更多程序性的东西,避免任何类型的循环.我使用上面的文章作为灵感,使用了测试数据脚本的改编版本和这种方法:

DECLARE @delimiter CHAR(1) = '-';

CREATE TABLE dbo.guids_split
WITH
(
    DISTRIBUTION = HASH(xguid),
    HEAP
)
AS
SELECT *
FROM dbo.guids g
    CROSS APPLY STRING_SPLIT ( xguid, @delimiter );
Run Code Online (Sandbox Code Playgroud)

该脚本现在在ADW上进行了测试,并且令人满意地工作了超过1亿条记录.这只用了4分钟,只有DWU 400(至少一次我添加了统计数据并删除了:) STRING_SPLIT.然而,guids是一个略微人为的例子,因为数据大小一致,并且总是只有5个部分要分开.

从Azure SQL数据仓库中获得良好的性能实际上与通过良好的哈希分发密钥最小化数据移动有关.因此,请发布一些实际的样本数据.

另一种选择是Azure Data Lake Analytics.ADLA支持联合查询"查询它所在的数据",因此您可以使用U-SQL查询原始表,使用本机.net方法对其进行拆分并输出可以使用Polybase轻松导入的方法.如果您需要有关此方法的更多帮助,请告诉我,我会举一个例子.

SQLCat团队已经发布了关于SQL数据仓库反模式的这篇文章,这种类型的字符串处理可能被认为是一个例子.请阅读这篇文章:

https://blogs.msdn.microsoft.com/sqlcat/2017/09/05/azure-sql-data-warehouse-workload-patterns-and-anti-patterns/