Presto UDAF 輸出數組(array)

1.版本0.189之前的使用:

@OutputFunction("array(" + StandardTypes.BIGINT + ")")

    public static void output(SliceState state, BlockBuilder out) {

        // 獲取狀態

        Slice slice = state.getSlice();

        // 數據爲空, 返回一個空數組

        if (null == slice) {

            BlockBuilder blockBuilder = BigintType.BIGINT.createBlockBuilder(new BlockBuilderStatus(), 0);

            out.writeObject(blockBuilder.build());

            out.closeEntry();

            return;

        }

        // 構造結果: [A:100, B:50, C:10, ......]

        BlockBuilder blockBuilder = BigintType.BIGINT.createBlockBuilder(new BlockBuilderStatus(), slice.length() / 4);

        for (int index = 0; index < slice.length(); index += 4) {

            BigintType.BIGINT.writeLong(blockBuilder, slice.getInt(index));

        }

        // 返回結果

        out.writeObject(blockBuilder.build());

        out.closeEntry();

    }

 

2.版本0.189之後請使用:

@OutputFunction("array(bigint)")
public static void output(@AggregationState SliceState state, BlockBuilder out) {
    // 獲取狀態
    Slice slice = state.getSlice();

    // 數據爲空, 返回一個空數組
    if (slice == null) {
        out.appendNull();
        return;
    }

    // 構造結果: [A:100, B:50, C:10, ......]
    BlockBuilder blockBuilder = out.beginBlockEntry();

    for (int index = 0; index < slice.length(); index += 4) {
        BIGINT.writeLong(blockBuilder, slice.getInt(index));
    }
    //返回結果
    out.closeEntry();
}

上面兩段代碼實現的邏輯相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章