在shark配置单元中创建连接两个现有表的表

acruukt9  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(362)

我有两张table oldTable 以及 newTable 内容如下: oldTable :

key    value    volume
  ======================
  1      abc      10000
  2      def      5000
``` `newTable` :

key value volume

1 abc 2000
2 def 3000
3 xyz 7000

我想创建一个新表来汇总 `volume` 两张table上都有。i、 例如,新表应包含以下内容: `joined_table` :

key value volume

1 abc 12000
2 def 8000
3 xyz 7000

我试着用以下语句,但没有结果:

CREATE TABLE joined_table AS
SELECT key, value, volume
FROM (
SELECT IF(oldTable.key != NULL, oldTable.key, newTable.key) AS key,
IF(oldTable.value != NULL, oldTable.value, newTable.value) AS value,
IF(oldTable.volume AND newTable.volume, oldTable.volume + newTable.volume,
IF(oldTable.volume != NULL, oldTable.volume, newTable.volume)) AS volume
FROM(
SELECT oldTable.key, oldTable.value, oldTable.volume, newTable.key, newTable.value, newTable.volume
FROM newTable FULL OUTER JOIN oldTable ON newTable.key = oldTable.key
)alias
)anotherAlias;

但这让我犯了一个错误 `Query returned non-zero code: 10, cause: FAILED: Error in semantic analysis: Ambiguous column reference key` .
我试着改变列表中的列名 `joined_table` 在上面的查询中,但它给了我相同的错误。关于如何实现这一点有什么帮助吗?
还有,有没有什么方法可以将结果覆盖到现有的表,比如 `oldTable` 而不是创建一个新的?
nbnkbykc

nbnkbykc1#

好 啊。我通过以下方法成功地完成了这一任务:

CREATE TABLE joined_table AS SELECT 
IF (newTable.key IS NULL, oldTable.key, newTable.key) as key, 
IF (newTable.value IS NULL, oldTable.value, newTable.value) as value, 
IF(newTable.volume IS NULL, oldTable.volume, 
   IF(oldTable.volume IS NULL, newTable.volume, oldTable.volume + newTable.volume)) as volume 
FROM newTable FULL OUTER JOIN oldTable ON newTable.key = oldTable.key;

我仍然需要弄清楚如何在不创建新表的情况下更新现有表。
更新 INSERT OVERWRITE TABLE oldTable SELECT ... 对现有表执行更新。

wxclj1h5

wxclj1h52#

这个词 key 您在查询中使用的是保留关键字。这可能是解析器抛出歧义错误的原因。您可以使用反勾号来避免解析器将其作为保留文本读取。

CREATE TABLE joined_table AS
SELECT `key`, value, volume
FROM (
SELECT IF(oldTable.`key` != NULL, oldTable.`key`, newTable.`key`) AS `key`,
    IF(oldTable.value != NULL, oldTable.value, newTable.value) AS value,
    IF(oldTable.volume AND newTable.volume, oldTable.volume + newTable.volume,
IF(oldTable.volume != NULL, oldTable.volume, newTable.volume)) AS volume
FROM(
    SELECT oldTable.`key`, oldTable.value, oldTable.volume, newTable.`key`, newTable.value, newTable,volume
    FROM newTable FULL OUTER JOIN oldTable ON newTable.`key` = oldTable.`key`;
)alias
)anotherAlias;

相关问题