1. 程式人生 > 其它 >FLINK SQL JOIN型別

FLINK SQL JOIN型別

一、REGULAR JOIN

  • INNER JOIN:在流處理任務中只用兩條流JOIN到才輸出,+[L, R]
  • LEFT JOIN:在流處理任務中,左流資料到達之後,不管有沒有JOIN到右流資料都會輸出(JOIN到:+[L, R],沒有JOIN:+[L, NULL]),如果右流資料到達之後,發現左流有輸出+[L, NULL],則會發起回撤,先輸出-[L, NULL],再輸出+[L, R]
  • RIGHT JOIN:左右流的執行邏輯和LEFT JOIN一樣
  • FULL JOIN:在流處理任務中,左流或者右流的資料到達之後,無論有沒有 Join 到另外一條流的資料,都會輸出(對右流來說:Join 到輸出 +[L, R],沒 Join 到輸出 +[NULL, R];對左流來說:JOIN到輸出,沒JOIN到輸出+[L, NULL])。如果一條流的資料到達之後,發現之前另一條流之前輸出過沒有 Join 到的資料,則會發起回撤流(左流資料到達為例:回撤-[NULL, R],輸出+[L, R],右流資料到達為例:回撤-[L, NULL],輸出+[L, R])  
  • 測試用例
    CREATE TABLE show_log_table(
        log_id      BIGINT,
        show_params STRING
    ) WITH (
      'connector' = 'datagen',
      'rows-per-second' = '5',
      'fields.show_params.length' = '1',
      'fields.log_id.min' = '1',
      'fields.log_id.max' = '100'
    );
    
    CREATE TABLE click_log_table(
        log_id       BIGINT,
        click_params STRING
    )
    
    WITH ( 'connector' = 'datagen', 'rows-per-second' = '5', 'fields.click_params.length' = '1', 'fields.log_id.min' = '1', 'fields.log_id.max' = '10' ); SELECT * FROM click_log_table LEFT JOIN show_log_table ON click_log_table.log_id = show_log_table.log_id ; SELECT * FROM click_log_table
    INNER JOIN show_log_table ON click_log_table.log_id = show_log_table.log_id ; SELECT * FROM click_log_table FULL JOIN show_log_table ON click_log_table.log_id = show_log_table.log_id ;
  • 注意:

    1)實時REGULAR JOIN支援等值JOIN和不等值JOIN,等值JOIN SHUFFLE策略是HASH,非等值JOIN策略是GLOBAL,所有資料發往一個併發,按照非等值條件進行關聯

    2)REGULAR JOIN會將兩條流的所有資料都儲存在 State 中,所以 Flink 任務的 State 會無限增大,因此需要為 State 配置合適的 TTL,以防止 State 過大

二、INTERVAL JOIN

  

三、TEMPORARY JOIN

四、LOOKUP JOIN

五、列轉行