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。我建议您将“扩展”问题作为一个新问题提问,并询问那里的性能。