Hive:填写缺少的列

时间:2017-01-05 11:23:10

标签: join hive sap self-join

我是Hive的新手,我的SQL知识有点生疏,因此在SO上发布了问题。

我有一个SAP表中的数据,其中缺少一列的值。我想知道如何填充这些列。

示例:

+----------+-----------+--------+
| EBELN    | BELNR     | EBELP  |
|----------+-----------+--------|
|    1     |   123     |  001   |
|----------+-----------+--------|
|          |   123     |  002   |
|----------+-----------+--------|
|          |   123     |  003   |
+----------+-----------+--------+

在上表中,所有三行都相互关联,但EBELN列的值仅出现在第一行。

当我使用EBELN列作为连接键将此表与其他表连接时,只有第一行出现在连接中。我希望将所有三行都放在输出连接中。

Expected output:
    +----------+-----------+--------+
    | EBELN    | BELNR     | EBELP  |
    |----------+-----------+--------|
    |    1     |   123     |  001   |
    |----------+-----------+--------|
    |    1     |   123     |  002   |
    |----------+-----------+--------|
    |    1     |   123     |  003   |
    +----------+-----------+--------+

我希望输出是这样的,这样我就可以使用EBELN列将此表与其他表联系起来。

我加入的表格不包含BELNREBELP列,因此我无法使用这些列进行加入。

我想知道我是否可以使用self join或者我还可以使用其他任何内容。

添加更多信息。我有其他表让我们称之为“ABCD”。该表格有EBELN列。

    +----------+-----------+--------+
    |   EBELN  |   COL12   |  COL13 |
    |----------+-----------+--------|
    |    1     |   ABC     |  LMN   |
    |----------+-----------+--------|
    |    2     |   DEF     |  OPQ   |
    |----------+-----------+--------|
    |    3     |   GHI     |  RST   |
    +----------+-----------+--------+

我试图使用EBELN列将此“ABCD”表与“EKPF”表联系起来。

我需要获取BELNR数字相同的所有行,但由于BELNR表中不存在ABCD列,我无法将其用于加入。

最终加入的输出应该看起来像

    +----------+-----------+--------+--------+--------+
    | EBELN    | BELNR     | EBELP  | COL12  | COL13  |
    |----------+-----------+--------+--------+--------|
    |    1     |   123     |  001   |   ABC  |   LMN  |
    |----------+-----------+--------+--------+--------|
    |          |   123     |  002   |   ABC  |   LMN  |
    |----------+-----------+--------+--------+--------|
    |          |   123     |  003   |   ABC  |  LMN   |
    |----------+-----------+--------+--------+--------|
    |    2     |           |        |  DEF   |  OPQ   |
    |----------+-----------+--------+--------+--------|
    |    3     |           |        |  GHI   |  RST   |
    +----------+-----------+--------+--------+--------+

2 个答案:

答案 0 :(得分:0)

从Hive中,您可以使用其中一个Conditional Functions函数来实现输出。

如果使用COALSCE,只需执行此操作:

SELECT COALESCE(EBELN, 1L) AS EBELN, BELNR,EBELP FROM your_table;

同样从Hive 0.11开始,您可以使用NVL功能

SELECT NVL(EBELN, 1) AS EBELN, BELNR,EBELP FROM your_table;

答案 1 :(得分:0)

如果您希望第一个(LEFT)表中的所有记录在结果中生成相应的记录,即使第二个(右侧)表中没有匹配,您也可以使用LEFT连接。对于相反的情况,一个使用RIGHT加入。由于您希望保留联接两侧的记录,因此需要FULL OUTER加入。

SELECT COALESCE(t1.EBELN, t2.EBELN), t1.BELNR, t1.EBELP ,
       t2.COL12, t2.COL13
  FROM EKPF t1
  FULL OUTER JOIN ABCD t2 ON t1.EBELN = t2.EBELN

COALESCE这里保证您将填充连接列(根据您的示例)。

输出结果为:

+----------+-----------+--------+--------+--------+
| EBELN    | BELNR     | EBELP  | COL12  | COL13  |
|----------+-----------+--------+--------+--------|
|    1     |   123     |  001   |   ABC  |   LMN  |
|----------+-----------+--------+--------+--------|
|          |   123     |  002   |   ABC  |   LMN  |
|----------+-----------+--------+--------+--------|
|          |   123     |  003   |   ABC  |  LMN   |
|----------+-----------+--------+--------+--------|
|    2     |           |        |  DEF   |  OPQ   |
|----------+-----------+--------+--------+--------|
|    3     |           |        |  GHI   |  RST   |
+----------+-----------+--------+--------+--------+