@Override
    protected Row deserializeInternal(byte[] bytes) {
        String text = new String(bytes, Charset.forName(charset));

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

            String[] fieldTexts = splitCsv(text, delimiter, escapeChar, quoteChar);
            if (fieldTexts.length != fieldNames.length) {
                failureCount = logCounter.increment();
                if (logCounter.shouldPrint()) {
                    LOG.warn("The number of fields mismatches: expected=[{}], actual=[{}]. " +
                            "The total mismatched data has accumulated to [{}].",
                            fieldNames.length, fieldTexts.length, failureCount);
                }
            }

            Row row = new Row(fieldNames.length);

            for (int i = 0; i < fieldNames.length; ++i) {
                if (i >= fieldTexts.length) {
                    row.setField(i, null);
                } else {
                    Object field =
                            deserializeBasicField(
                                    fieldNames[i],
                                    fieldFormatInfos[i],
                                    fieldTexts[i],
                                    nullLiteral, null);

                    row.setField(i, field);
                }
            }

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