Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql HiveQL:构建成对比较表_Sql_Hiveql - Fatal编程技术网

Sql HiveQL:构建成对比较表

Sql HiveQL:构建成对比较表,sql,hiveql,Sql,Hiveql,我正在尝试构建一个包含id成对比较的配置单元表。例如,假设我们从表A开始: id val a 10 b 11 c 12 我想创建一个表B: id_A id_B val_A val_B val_diff a b 10 11 -1 a c 10 12 -2 b c 11 12 -1 我相信这需要一个自连接,但我不知道如何做。如有任何想法或线索,我们将不胜感激 我试过: CREAT

我正在尝试构建一个包含
id
成对比较的配置单元表。例如,假设我们从表
A
开始:

id  val
a   10
b   11
c   12
我想创建一个表
B

id_A  id_B  val_A  val_B  val_diff
a     b     10     11     -1
a     c     10     12     -2
b     c     11     12     -1
我相信这需要一个自连接,但我不知道如何做。如有任何想法或线索,我们将不胜感激

我试过:

CREATE TABLE C STORED AS ORC AS
SELECT a.id         AS id_A, 
       b.id         AS id_B,
       a.val         AS val_A,
       b.val         AS val_B,
       a.val - b.val AS val_diff
FROM A AS a
INNER JOIN B as b
ON a.id != b.id;
但它不起作用:

FAILED: SemanticException [Error 10017]: Line 4:3 Both left and right aliases encountered in JOIN 'id'
更新: 问题扩展

假设我有一个表
A'

id  val  category
a   10   X
b   11   X
c   12   X
d   13   Y
e   14   Y
f   15   Y
如何仅在每个
类别的元素之间进行成对比较

例如,一个表
B'

id_A  id_B  val_A  val_B  val_diff cat
a     b     10     11     -1       X
a     c     10     12     -2       X
b     c     11     12     -1       X
d     e     . . .                  Y
d     f     . . .                  Y
e     f     . . .                  Y
您可以使用自联接:

select a.id as id_a, b.id as id_b, a.val as val_a, b.val as val_b,
       (a.val - b.val) as val_diff
from t a join
     t b
     on a.id < b.id;
选择a.id作为id_a,b.id作为id_b,a.val作为val_a,b.val作为val_b,
(a.val-b.val)作为val_diff
从一个连接
TB
a.id
在Hive中,您可能需要执行以下操作:

select a.id as id_a, b.id as id_b, a.val as val_a, b.val as val_b,
       (a.val - b.val) as val_diff
from t a cross join
     t b
where a.id < b.id;
选择a.id作为id_a,b.id作为id_b,a.val作为val_a,b.val作为val_b,
(a.val-b.val)作为val_diff
从交叉连接开始
TB
其中a.id
这个不等式如何比较字符串?不确定如何阅读它(“在a小于b的地方连接”?),而且,从纯编码语义的角度来看,a.id b.id上的
难道不是更易于解释(我知道它不起作用)?你想要每个id的组合,而不是每个排列。在你的例子中,你有a,b,c。所以你有(a,b),(a,c)和(b,c)。因为(b,c)和(c,b)是一样的,你真的不需要所有的排列。此外,如果这是配置单元,您可能必须将a.idid
的表。也可能是我的计算群集速度,但作业已经运行了好几天了。@user2205916。我建议您将“扩展”问题作为一个新问题提问,并询问那里的性能。