直播平臺原始碼,FlinkSQL實現行轉列

zhibo系統開發發表於2023-10-08

直播平臺原始碼,FlinkSQL實現行轉列

1、使用 UNNEST 解析

select 
name,course,score
from ods_kafka_student_scores 
CROSS JOIN UNNEST(`list`) AS t (course,score);
select 
name,course,score
from ods_kafka_student_scores, UNNEST(`list`) AS t (course,score);
select 
name,course,score
from ods_kafka_student_scores 
LEFT JOIN UNNEST(`list`) AS t (course,score) on true;


2、使用自定義 UDTF 解析

UDTF(自定義表值函式),自定義表值函式。


將 0 個、1 個或多個標量值作為輸入引數(可以是變長引數)。與自定義的標量函式類似,但與標量函式不同。表值函式可以返回任意數量的行作為輸出,而不僅是 1 個值。返回的行可以由 1 個或多個列組成。呼叫一次函式輸出多行或多列資料。


必須繼承 TableFunction 基類,並實現一個或者多個名為 eval 的方法。


在使用 UDTF 時,需要帶上 LATERAL TABLE兩個關鍵字.

@FunctionHint(output = @DataTypeHint("ROW<course STRING,score INT>"))
public class ParserJsonArrayTest extends TableFunction<Row> {
    private static final Logger LOG = Logger.getLogger(ParserJsonArrayTest.class);
    public void eval(String value) {
        try {
            JSONArray arrays = JSONArray.parseArray(value);
            Iterator<Object> iterator = arrays.iterator();
            while (iterator.hasNext()) {
                JSONObject jsonObject = (JSONObject) iterator.next();
                String course = jsonObject.getString("course");
                Integer score = jsonObject.getInteger("score");
                collect(Row.of(course,score));
            }
        } catch (Exception e) {
            LOG.error("Parser json failed :" + e.getMessage());
        }
    }
}


自定義 UDTF 解析的時候,就不需要把 list 欄位定義成 ARRAY 型別了,直接定義成 STRING 型別就可以了,並且這種方式會更加的靈活,比如還需要過濾資料或者更復雜的一些操作時都可以在 UDTF 裡面完成.

 以上就是 直播平臺原始碼,FlinkSQL實現行轉列,更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2987357/,如需轉載,請註明出處,否則將追究法律責任。

相關文章