U-SQL用户定义的组合器返回错误的数据

时间:2018-02-19 09:22:42

标签: u-sql

我尝试使用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();
  }

 }

1 个答案:

答案 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();

我的结果: Results