【问题标题】:Hive : Fill in missing columnsHive : 填写缺失的列
【发布时间】:2017-05-19 22:08:42
【问题描述】:

我是 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   |
    +----------+-----------+--------+--------+--------+

【问题讨论】:

  • 行之间有什么关系?通过 BELNR 列? EBELN 列应该如何计算?
  • EBELN计算可以使用自连接或其他方式,但需要先定义规则。
  • 您好,感谢您宝贵的时间。我更新了问题详情以反映我打算做什么。
  • 您真的需要在 EBELN 中用 1 填充所有表吗?

标签: join hive sap self-join


【解决方案1】:

在 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;

【讨论】:

    【解决方案2】:

    如果你想为第一个(LEFT)表中的所有记录在结果中生成对应的记录,即使第二个(RIGHT)表中没有匹配项,你也可以使用LEFTjoin。对于相反的情况,使用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   |
    +----------+-----------+--------+--------+--------+
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2018-05-02
      • 2018-10-05
      相关资源
      最近更新 更多