@Override
    protected Row deserializeInternal(byte[] bytes) throws IOException {

        String text = new String(bytes, Charset.forName(charset));

        try {
            Map<String, String> fieldTexts =
                    splitKv(text, entryDelimiter, kvDelimiter, escapeChar, quoteChar);

            String[] fieldNames = rowFormatInfo.getFieldNames();
            FormatInfo[] fieldFormatInfos = rowFormatInfo.getFieldFormatInfos();

            Row row = new Row(fieldFormatInfos.length);

            for (int i = 0; i < fieldFormatInfos.length; ++i) {

                String fieldName = fieldNames[i];
                FormatInfo fieldFormatInfo = fieldFormatInfos[i];

                String fieldText = fieldTexts.get(fieldName);

                Object field =
                        deserializeBasicField(
                                fieldName,
                                fieldFormatInfo,
                                fieldText,
                                nullLiteral, null);
                row.setField(i, field);
            }

            return row;
        } catch (Throwable t) {
            throw new RuntimeException(
                    String.format("Could not properly deserialize kv. Text=[%s].", text), t);
        }
    }
The literal represented null values, default "".
inlong-sort/sort-formats/format-row/format-kv/src/main/java/org/apache/inlong/sort/formats/kv/KvDeserializationSchema.java