代码之家  ›  专栏  ›  技术社区  ›  mitroberts

U-SQL不允许非等联接

  •  1
  • mitroberts  · 技术社区  · 6 年前

    我偶然发现U-SQL有点问题,对我来说,这是一个我还没有找到解决方法的问题。

    似乎U-SQL不支持任何其他内容,但在联接中==除外,因此不能将>或<放在联接本身中。

    对于下面我在Oracle中所做的用例:

    create table trf.test_1(
    数字节点
    ;
    
    
    插入trf.test_1值(10);
    插入trf.test_1值(20);
    插入trf.test_1值(30);
    插入trf.test_1值(60);
    
    删除表trf.test_2;
    创建表trf.test_2(
    数字节点
    ;
    
    
    插入trf.test_2值(20);
    插入trf.test_2值(30);
    
    
    选择T1.number_col,T2.number_col
    
    来自TRF.TEST U1 T1
    在T1.number_col<T2.number_col上左连接trf.test_2 t2
    ;
    < /代码> 
    
    

    我得到以下信息:

    如果没有<联接,我如何在U-SQL中执行此操作?

    我尝试了交叉联接,但是如果您在WHERE子句中包含<,它就会变成一个内部联接,并且您不会得到带有空值的行。

    感谢您的任何想法。

    T1时= 从中选择* (值 (10) (20) (30) (60) )以t(num_col)表示; @ T2= 从中选择* (值 (20) (30) )以t(num_col)表示; 结果= 选择t1.num_col,t2.num_col作为num_col_2 从T1到T1 t2与t2交叉连接 其中T1.num_col<T2.num_col; @结果2 选择t1.num_col,t2.num_col作为num_col_2 从T1到T1 左联接@result as t2 on t1.num_col==t2.num_col; 输出@结果2 到“/output/referenceguide/joins/examplea.csv” 使用outputters.csv(); < /代码>

    编辑-我将@T1数据集的左联接添加回了@result集,这似乎有效,但如果有更好的解决方案,我会感兴趣。似乎有点麻烦。

    对于下面我在Oracle中所做的用例:

    create table trf.test_1(
    number_col int
    );
    
    
    insert into trf.test_1 VALUES (10);
    insert into trf.test_1 VALUES (20);
    insert into trf.test_1 VALUES (30);
    insert into trf.test_1 VALUES (60);
    
    drop table trf.test_2;
    create table trf.test_2(
    number_col int
    );
    
    
    insert into trf.test_2 VALUES (20);
    insert into trf.test_2 VALUES (30);
    
    
    SELECT t1.number_col, t2.number_col
    
    FROM trf.test_1 t1
    LEFT JOIN trf.test_2 t2 ON t1.number_col < t2.number_col
    ;
    

    我得到以下信息:

    enter image description here

    如果没有<联接,我如何在U-SQL中执行此操作?

    我尝试了交叉联接,但是如果您在WHERE子句中包含<,它就会变成一个内部联接,并且您不会得到带有空值的行。

    有什么好主意吗?

    @t1 = 
         SELECT * FROM 
         ( VALUES
         (10),
         (20),
         (30),
         (60)
         ) AS T(num_col);
    
    @t2 = 
     SELECT * FROM 
         ( VALUES
         (20),
         (30)
         ) AS T(num_col);
    
    @result =
        SELECT t1.num_col, t2.num_col AS num_col_2
        FROM @t1 AS t1
         CROSS JOIN @t2 AS t2
      WHERE t1.num_col < t2.num_col;
    
     @result2 = 
     SELECT t1.num_col, t2.num_col AS num_col_2
     FROM @t1 AS t1
      LEFT JOIN @result AS t2 ON t1.num_col == t2.num_col;
    
     OUTPUT @result2
     TO "/Output/ReferenceGuide/Joins/exampleA.csv"
     USING Outputters.Csv();
    

    编辑-我将@T1数据集的左联接添加回了@result集,这似乎有效,但如果有更好的解决方案,我会感兴趣。好像有点麻烦。

    1 回复  |  直到 6 年前
        1
  •  2
  •   wBob    6 年前

    这是一个众所周知的特点,本文对此进行了广泛讨论。” U-SQL SELECT Selecting from joins “。

    那篇文章的一些引言:

    联接比较

    U-SQL,像大多数扩展的大数据查询语言一样 支持联接,将联接比较限制为相等 要联接的行集中的列之间的比较…

    如果比较中有一个不相等比较或更复杂的表达式(例如方法调用),则可以将比较移动到selectwhere子句。或者,可以将更复杂的表达式放在前面的select语句列中,然后在联接比较中引用该别名。

    基本上,在像ADLA这样的分布式平台上,它们的伸缩性不是特别好。