U-SQL将列拆分为两个,由“ - ”分隔

时间:2018-01-08 15:13:16

标签: c# sql split azure-data-lake u-sql

我试图通过在数据湖分析中使用U-SQL将列拆分为两个。在SQL中可以这样做:

    ,CASE WHEN [Total] like '%-%' 
        THEN TRIM(LEFT([Total],CHARINDEX('-',[Total]) - 1)) END AS [TotalLeft]
    ,TRIM(REPLACE(SUBSTRING([Total],CHARINDEX('-',[Total]),LEN([Total])),'-','')) AS TotalRight

我在U-SQL中尝试了类似的东西,但似乎在U-SQL中不存在LEFT。

([Total] LIKE "%-%") ? Left([Total].IndexOf("-"), 1).Trim                   : 0 AS TotalLeft,

我读过有关使用数组和EXPLODE的内容,但这似乎只是将它分成更多行而不是列。

此外,我正在考虑使用EXTRACT并将分隔符设置为“ - ”,但这似乎也不是一种选择。

任何人都对如何有效地解决这个问题有任何想法?谢谢!

3 个答案:

答案 0 :(得分:5)

以下是使用Split的替代方法。对我来说感觉稍微简单一些,但总有不止一种方法可以做。除非您希望元素显示为行,否则您不需要使用EXPLODE。如果您要拆分的项目超过两个,则扩展起来会更容易,感谢David提供了我已经重复使用的示例查询。

@data =
    SELECT *
    FROM(
        VALUES
        ( "12-34" )
    ) AS T(col1);


@result =
    SELECT array[0] AS totalLeft,
           array[1] AS totalRight
    FROM
        (
            SELECT new SQL.ARRAY<string>(col1.Split('-')) AS array
            FROM @data
        ) AS x;


OUTPUT @result
TO "/output/result.txt"
USING Outputters.Tsv();

答案 1 :(得分:4)

这应该让你开始。另请参阅C# Functions and Operators (U-SQL)

@data = 
SELECT * FROM 
    ( VALUES
    ("12-34")
    ) AS T(col1);

@result =
    SELECT 
    col1.Substring(0, col1.IndexOf("-")) AS totalLeft,
    col1.Substring(col1.IndexOf("-")+1) AS totalRight
FROM @data;

OUTPUT @result
TO "/Test/result.txt"
USING Outputters.Tsv();

答案 2 :(得分:2)

在这里加我的两分钱。 还有一个更短的版本。

@data = 
SELECT * FROM 
    ( VALUES
    ("12-34")
    ) AS T(col1);

@result =
    SELECT 
    col1.Split('-')[0] AS totalLeft,
    col1.Split('-')[1] AS totalRight
FROM @data;

OUTPUT @result
TO "/Test/result.txt"
USING Outputters.Tsv();