我尝试使用Data lake Analytics并创建了一个简单的USQL组合器,但只要我理解它就会返回错误的数据。它返回3行:
2R
3R
3R
但我希望它应该返回6行:1L,2L,3L,1R,2R,3R。
这是代码:
@T1 = SELECT * FROM (VALUES ("1"), ("2"), ("3")) AS T(DummyValue);
@T2 = SELECT * FROM (VALUES ("1"), ("2"), ("3")) AS T(DummyValue);
@Result =
COMBINE @T1 AS fis
WITH @T2 AS frs
ON fis.DummyValue == frs.DummyValue
PRODUCE DummyValue string
USING new Demo.MyCombiner();
OUTPUT @Result TO "/o.csv" USING Outputters.Csv();
[SqlUserDefinedCombiner(Mode = CombinerMode.Full)]
public class MyCombiner : ICombiner {
public override IEnumerable<IRow> Combine(IRowset left, IRowset right, IUpdatableRow output) {
var CopyLeft = left.Rows.ToList();
var CopyRight = right.Rows.ToList();
foreach (var Item in CopyLeft) {
var X = Item.Get<string>("DummyValue");
output.Set<string>("DummyValue", X + "L");
}
foreach (var Item in CopyRight) {
var X = Item.Get<string>("DummyValue");
output.Set<string>("DummyValue", X + "R");
}
yield return output.AsReadOnly();
}
}
答案 0 :(得分:3)
您正在进行的操作实际上是UNION ALL
,因此可以使用基本U-SQL更简单地完成此操作,例如:
@Result =
SELECT DummyValue + "L" AS DummyValue
FROM @T1
UNION ALL
SELECT DummyValue + "R" AS DummyValue
FROM @T2;
假设您出于某些特定原因想要使用自定义COMBINER,那么您只为两个循环调用yield return...
一次,这就是为什么您只获得三行的原因。也许您可以告诉我们更多关于您要做什么的事情?
但是,如果您确实需要使用自定义组合器UNION ALL
,那么这对我有用:
[SqlUserDefinedCombiner]
public class MyCombiner : ICombiner
{
public override IEnumerable<IRow> Combine(IRowset left, IRowset right, IUpdatableRow output)
{
foreach (IRow rowR in right.Rows)
{
output.Set<string>("NewValue", rowR.Get<string>("DummyValue").ToString() + "R");
yield return output.AsReadOnly();
}
foreach (IRow rowL in left.Rows)
{
output.Set<string>("NewValue", rowL.Get<string>("DummyValue").ToString() + "L");
yield return output.AsReadOnly();
}
}
}
U-SQL调用我的自定义组合器:
@Result =
COMBINE @T1 AS fis WITH @T2 AS frs
ON fis.DummyValue == frs.DummyValue
PRODUCE NewValue string
USING new Demo.MyCombiner();