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

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

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

  1. key value volume
  2. ======================
  3. 1 abc 10000
  4. 2 def 5000
  5. ``` `newTable` :

key value volume

1 abc 2000
2 def 3000
3 xyz 7000

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

key value volume

1 abc 12000
2 def 8000
3 xyz 7000

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

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;

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

nbnkbykc1#

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

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

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

wxclj1h5

wxclj1h52#

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

  1. CREATE TABLE joined_table AS
  2. SELECT `key`, value, volume
  3. FROM (
  4. SELECT IF(oldTable.`key` != NULL, oldTable.`key`, newTable.`key`) AS `key`,
  5. IF(oldTable.value != NULL, oldTable.value, newTable.value) AS value,
  6. IF(oldTable.volume AND newTable.volume, oldTable.volume + newTable.volume,
  7. IF(oldTable.volume != NULL, oldTable.volume, newTable.volume)) AS volume
  8. FROM(
  9. SELECT oldTable.`key`, oldTable.value, oldTable.volume, newTable.`key`, newTable.value, newTable,volume
  10. FROM newTable FULL OUTER JOIN oldTable ON newTable.`key` = oldTable.`key`;
  11. )alias
  12. )anotherAlias;

相关问题