U-SQL 将一列一分为二,以“-”分隔
U-SQL splitting a column into two, delimited by "-"
我正在尝试通过在数据湖分析中使用 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 中尝试过类似的东西,但似乎 LEFT 在 U-SQL 中不存在。
([Total] LIKE "%-%") ? Left([Total].IndexOf("-"), 1).Trim : 0 AS TotalLeft,
我读过有关使用数组和 EXPLODE 的信息,但这似乎只是将其拆分为更多行而不是列。
此外,我正在考虑使用 EXTRACT 并将分隔符设置为“-”,但这似乎也不是一个选项。
有人知道如何有效地解决这个问题吗?谢谢!
这应该可以帮助您入门。另请参阅,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();
这是使用 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();
只是在这里加上我的两分钱。
还有一个更短的版本。
@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();
我正在尝试通过在数据湖分析中使用 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 中尝试过类似的东西,但似乎 LEFT 在 U-SQL 中不存在。
([Total] LIKE "%-%") ? Left([Total].IndexOf("-"), 1).Trim : 0 AS TotalLeft,
我读过有关使用数组和 EXPLODE 的信息,但这似乎只是将其拆分为更多行而不是列。
此外,我正在考虑使用 EXTRACT 并将分隔符设置为“-”,但这似乎也不是一个选项。
有人知道如何有效地解决这个问题吗?谢谢!
这应该可以帮助您入门。另请参阅,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();
这是使用 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();
只是在这里加上我的两分钱。 还有一个更短的版本。
@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();