All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.spark.sql.mlsql.sources.mysql.binlog.MySQLCDCUtils Maven / Gradle / Ivy

There is a newer version: 1.0.4
Show newest version
package org.apache.spark.sql.mlsql.sources.mysql.binlog;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.spark.sql.mlsql.sources.mysql.binlog.io.SchemaTool;

import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.TimeZone;

/**
 * 2019-06-13 WilliamZhu([email protected])
 */
public class MySQLCDCUtils {


    public static Object getWritableObject(SchemaTool schemaTool, Serializable value) {
        if (value == null) {
            return null;
        }
        if (value instanceof byte[]) {
            return new String((byte[]) value, Charset.forName(schemaTool.charset()));
        }

        if (value instanceof BitSet) {
            BitSet bsValue = ((BitSet) value);
            if (schemaTool.isBoolean()) {
                return bsValue.get(0) ? true : false;
            }

            if (schemaTool.isLong()) {
                long longValue = 0;
                byte[] by = bsValue.toByteArray();
                for (int i = 0; i < by.length; i++)
                {
                    longValue += ((long) by[i] & 0xffL) << (8 * i);
                }
                return longValue;
            }
            throw new RuntimeException("cannot serializer for " + schemaTool.field().name());
        }

        if (schemaTool.isTimestamp() && value instanceof java.sql.Timestamp) {
            java.sql.Timestamp item = (java.sql.Timestamp) value;
            FastDateFormat timestampFormat = JsonOptions.options(schemaTool.timeZone()).timestampFormat();
            return timestampFormat.format(item);
        }

        // mysql datetime type
        if (schemaTool.isTimestamp() && value instanceof java.util.Date) {
            org.joda.time.DateTime item = new org.joda.time.DateTime((java.util.Date) value);
            int offset = TimeZone.getTimeZone(ZoneId.of(schemaTool.timeZone())).getRawOffset();
            FastDateFormat timestampFormat = JsonOptions.options(schemaTool.timeZone()).timestampFormat();
            return timestampFormat.format(item.minusMillis(offset).toDate());
        }

        if (schemaTool.isDate() && value instanceof java.sql.Date) {
            java.sql.Date item = (java.sql.Date) value;
            FastDateFormat dateFormat = JsonOptions.options(schemaTool.timeZone()).dateFormat();
            return dateFormat.format(item);
        }

        if (schemaTool.isDate() && value instanceof java.util.Date) {
            java.util.Date item = (java.util.Date) value;
            FastDateFormat dateFormat = JsonOptions.options(schemaTool.timeZone()).dateFormat();
            return dateFormat.format(item);
        }

        return value;
    }
}

class BitSetSerializer extends JsonSerializer {

    public void serialize(BitSet value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeStartArray();
        for (long l : value.toLongArray()) {
            gen.writeNumber(l);
        }
        gen.writeEndArray();
    }
}

class BitSetDeserializer extends JsonDeserializer {

    @Override
    public BitSet deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ArrayList l = new ArrayList();
        JsonToken token;
        while (!JsonToken.END_ARRAY.equals(token = jsonParser.nextValue())) {
            if (token.isNumeric()) {
                l.add(jsonParser.getLongValue());
            }
        }

        long[] array = new long[l.size()];
        for (int i = 0; i < array.length; i++) {
            array[i] = l.get(i).longValue();
        }
        return BitSet.valueOf(array);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy