Commit 234b680e authored by sheteng's avatar sheteng

init

parents
#Thu Jul 22 10:20:45 CST 2021
gradle.version=6.8
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../:\project\appsflyer_advert_new_flink\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<component name="ArtifactManager">
<artifact type="jar" name="appsflyer_advert_new_flink.main:jar">
<output-path>$PROJECT_DIR$/out/artifacts/appsflyer_advert_new_flink_main_jar</output-path>
<root id="archive" name="appsflyer_advert_new_flink.main.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/src/main/java/META-INF/MANIFEST.MF" />
</element>
<element id="module-output" name="appsflyer_advert_new_flink.main" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-statebackend-rocksdb_2.12/1.11.1/a9d913568047b3946460847913d87fa82da4d5af/flink-statebackend-rocksdb_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.twitter/chill-java/0.7.6/a74b8d019d6941d82ff86d1612e382f4a0ae8259/chill-java-0.7.6.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.1.6.RELEASE/9329591e728ef9844911e082e399f4fc3e3ecb37/spring-core-5.1.6.RELEASE.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.scala-lang/scala-library/2.12.7/18c09ad08ec783f5074f4a0d6308a78759000cb1/scala-library-2.12.7.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe.akka/akka-protobuf_2.12/2.5.21/84cad0e77bc6fc66bb07fc5ebb55c29aed490b42/akka-protobuf_2.12-2.5.21.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-runtime_2.12/1.11.1/a3c864ad3e649259622ebadb7cbd3d24d739ed93/flink-runtime_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.4.0/32ecccc595e4e4d813a80ee9e3ab5813d65874eb/error_prone_annotations-2.4.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-math3/3.5/13af68e9a11576953f5c4b09436f8207be9d3a27/commons-math3-3.5.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/io.leangen.geantyref/geantyref/1.3.7/cfc04bc83f50063d294366621aaec10c2c5858da/geantyref-1.3.7.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.3.2/90a3822c38ec8c996e84c16a3477ef632cbc87a3/commons-lang3-3.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-cli/commons-cli/1.3.1/1303efbc4b181e5a58bf2e967dc156a3132b97c0/commons-cli-1.3.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe.akka/akka-slf4j_2.12/2.5.21/7f8ba1ea2c9fecc97dc2ad991c1c85f676f389de/akka-slf4j_2.12-2.5.21.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.antlr/antlr4-runtime/4.7.2/e27d8ab4f984f9d186f54da984a6ab1cccac755e/antlr4-runtime-4.7.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.xerial.snappy/snappy-java/1.1.7.3/241bb74a1eb37d68a4e324a4bc3865427de0a62d/snappy-java-1.1.7.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/ru.yandex.clickhouse/clickhouse-jdbc/0.1.52/1c7bced71b3b89c1dbf1d6f1797ca24ec99313da/clickhouse-jdbc-0.1.52.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe.akka/akka-stream_2.12/2.5.21/307ed39c4fd1399afe115bae4b0eca2ee8c09d14/akka-stream_2.12-2.5.21.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.luben/zstd-jni/1.4.3-1/c3c8278c6a02b332a21fcd2c22434d0bc928126d/zstd-jni-1.4.3-1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.1.6.RELEASE/a4ad3c98c7cc31357e94e12772c8e6449522bc5/spring-jcl-5.1.6.RELEASE.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-shaded-netty/4.1.39.Final-11.0/5e1dbd24cb5c43d9ee9a05c967fec57e5946020f/flink-shaded-netty-4.1.39.Final-11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.4/d0de1ca9b69e69d1d497ee3c6009d015f64dad57/gson-2.8.4.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/redis.clients/jedis/3.5.1/a7721eab0680d9dd75238ae6be2d51e86041623d/jedis-3.5.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe/config/1.3.3/4b68c2d5d0403bb4015520fcfabc88d0cbc4d117/config-1.3.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.30/b5a4b6d16ab13e34a88fae84c35cd5d68cac922c/slf4j-api-1.7.30.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.14.1/67612a22d4b8f33c55263b188bf5a72774d06d18/okhttp-3.14.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.zaxxer/HikariCP/3.4.5/aa1a2c00aae8e4ba8308e19940711bb9525b103d/HikariCP-3.4.5.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-hadoop-fs/1.11.1/69f8c4005654446ec0ab14511f3474748928b8ef/flink-hadoop-fs-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.24.0-GA/d7466fc2e3af7c023e95c510f06448ad29b225b3/javassist-3.24.0-GA.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.jpountz.lz4/lz4/1.3.0/c708bb2590c0652a642236ef45d9f99ff842a2ce/lz4-1.3.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-shaded-guava/18.0-11.0/7baa3db73cff0046f1f4ff78bbb7c4ca919fdf83/flink-shaded-guava-18.0-11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-core/1.11.1/6e27b3e26b97f1eedf1d9471a70b26338030df20/flink-core-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.7.3/1499b854ae9f370409792db5af1b552dc7d9682f/jackson-core-2.7.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.ben-manes.caffeine/caffeine/2.8.5/f0eafef6e1529a44e36549cd9d1fc06d3a57f384/caffeine-2.8.5.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-pool2/2.6.2/775a8072995b29eafe8fb0a828a190589f71cede/commons-pool2-2.6.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.20/b8df472b31e1f17c232d2ad78ceb1c84e00c641b/commons-compress-1.20.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.11.4/7ec0925cc3aef0335bbc7d57edfd42b0f86f8267/protobuf-java-3.11.4.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-streaming-java_2.12/1.11.1/249d41d61a6bf8516da3c6999e9377af422d4aaa/flink-streaming-java_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.esotericsoftware.kryo/kryo/2.24.0/c6b206e80cfd97e66a1364003724491c757b92f/kryo-2.24.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.7.0/19f42c154ffc689f40a77613bc32caeb17d744e3/jackson-annotations-2.7.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.4.1/b3df2bf4d7d258e5aa192c3ac6f7f84688046262/checker-qual-3.4.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-java/1.11.1/30dfdb467199961ced3693f18f99f393205d5668/flink-java-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.lz4/lz4-java/1.6.0/b49e2b422a5b7145ba7aa0c3f60c13664a5c5acf/lz4-java-1.6.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe.akka/akka-actor_2.12/2.5.21/7df4cee798df7b5711da83d1407fec31591a0f09/akka-actor_2.12-2.5.21.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.clapper/grizzled-slf4j_2.12/1.3.2/a41ef16fbcec3d992bcf323277d0519dba47ed5f/grizzled-slf4j_2.12-1.3.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.scala-lang.modules/scala-parser-combinators_2.12/1.1.1/29b4158f9ddcc22d1c81363fd61a8bef046f06b9/scala-parser-combinators_2.12-1.1.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.xml.bind/jaxb-api/2.3.0/99f802e0cb3e953ba3d6e698795c4aeb98d37c48/jaxb-api-2.3.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/8.0.25/f8b9123acd13058c941aff25f308c9ed8000bb73/mysql-connector-java-8.0.25.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-shaded-zookeeper-3/3.4.14-11.0/50cf88ddea07f31b482f192a302319bde91429b8/flink-shaded-zookeeper-3-3.4.14-11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.typesafe/ssl-config-core_2.12/0.3.7/78a93560e191dcb6bd7217be643c5d14ee1ab0ba/ssl-config-core_2.12-0.3.7.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio/1.17.2/78c7820b205002da4d2d137f6f312bd64b3d6049/okio-1.17.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.1.6.RELEASE/90d2f4bf7eced108de0b5bf617abb2b13a6206a3/spring-beans-5.1.6.RELEASE.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.data-artisans/frocksdbjni/5.17.2-artisans-2.0/bd1ac0bf390931483c95f91530803c7d63c8ae5c/frocksdbjni-5.17.2-artisans-2.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-clients_2.12/1.11.1/6ef5877f202e3c9a730cce1f0c58fae6ed18eb7e/flink-clients_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/19.0/6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9/guava-19.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.twitter/chill_2.12/0.7.6/37ab91c4029e8c34f39bfc6c2c7735ba69c6f53f/chill_2.12-0.7.6.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-metrics-core/1.11.1/7a5abaa8ee132f83329b8afbc049d2c0c4132916/flink-metrics-core-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-queryable-state-client-java/1.11.1/c78b40348b32c7c6e69f58efa89305e4ddfe6560/flink-queryable-state-client-java-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jdbi/jdbi3-core/3.18.0/bd4cf18f511771883624423068c6fd236edd7f63/jdbi3-core-3.18.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.esotericsoftware.minlog/minlog/1.2/59bfcd171d82f9981a5e242b9e840191f650e209/minlog-1.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/2.1/87c0ea803b69252868d09308b4618f766f135a96/objenesis-2.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.7.3/f12e6cd05cbaecd74d16e685d45b627732939e42/jackson-databind-2.7.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-connector-kafka_2.12/1.11.1/8e1d9da975f75afb157dd4378fb389ed4fb77385/flink-connector-kafka_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.5.2/22b4c53dd9b6761024258de8f9240c3dce6ea368/httpmime-4.5.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-shaded-jackson/2.10.1-11.0/70d6fc7311ab4b716b6d49580cd046077b97c0bf/flink-shaded-jackson-2.10.1-11.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.2/733db77aa8d9b2d68015189df76ab06304406e50/httpclient-4.5.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.scopt/scopt_2.12/3.5.0/8de7c2a8b022bca5690f484a7f0d2518e0e4cf53/scopt_2.12-3.5.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.kafka/kafka-clients/2.4.1/34bf95270bf67d2df75993b46ab25b62679035a9/kafka-clients-2.4.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-collections/commons-collections/3.2.2/8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5/commons-collections-3.2.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-annotations/1.11.1/7d01362af5c56f008c28036c4e8dc878dc3fba34/flink-annotations-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.alibaba/fastjson/1.2.62/9243497a2f1f9d40d7d1d8d852f0abdc71955532/fastjson-1.2.62.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jdbi/jdbi3-sqlobject/3.18.0/86bcabd00a9f09d0f0ca2d8ab273f1096f88fae4/jdbi3-sqlobject-3.18.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-connector-kafka-base_2.12/1.11.1/51f306f77bd4e591ab973db7ae8e13f1daa87c35/flink-connector-kafka-base_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.9/9ce04e34240f674bc72680f8b843b1457383161a/commons-codec-1.9.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/force-shading/1.11.1/4221206dc66861c8938e8872c609e1f63ab33b7c/force-shading-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.2/323964c36556eb0e6209f65c1cef72b53b461ab8/reactive-streams-1.0.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.scala-lang.modules/scala-java8-compat_2.12/0.8.0/1e6f1e745bf6d3c34d1e2ab150653306069aaf34/scala-java8-compat_2.12-0.8.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-optimizer_2.12/1.11.1/547fb1d79ccd85f8ed881ad9931fccd5d380db2d/flink-optimizer_2.12-1.11.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.4/b31526a230871fbe285fbcbe2813f9c0839ae9b0/httpcore-4.4.4.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.flink/flink-shaded-asm-7/7.1-11.0/4b8964319bf68fe546eccbe6a37cc4348c612416/flink-shaded-asm-7-7.1-11.0.jar" path-in-jar="/" />
</root>
</artifact>
</component>
\ No newline at end of file
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Gradle Imported" enabled="true">
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.projectlombok/lombok/1.18.18/481f5bfed3ae29f656eedfe9e98c8365b8ba5c57/lombok-1.18.18.jar" />
</processorPath>
<module name="appsflyer_advert_new_flink.main" />
<module name="appsflyer_advert_new_flink.test" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel target="1.8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="libraries-with-intellij-classes">
<option name="intellijApiContainingLibraries">
<list>
<LibraryCoordinatesState>
<option name="artifactId" value="ideaIU" />
<option name="groupId" value="com.jetbrains.intellij.idea" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="ideaIU" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="ideaIC" />
<option name="groupId" value="com.jetbrains.intellij.idea" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="ideaIC" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="pycharmPY" />
<option name="groupId" value="com.jetbrains.intellij.pycharm" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="pycharmPY" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="pycharmPC" />
<option name="groupId" value="com.jetbrains.intellij.pycharm" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="pycharmPC" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="clion" />
<option name="groupId" value="com.jetbrains.intellij.clion" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="clion" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="riderRD" />
<option name="groupId" value="com.jetbrains.intellij.rider" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="riderRD" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="goland" />
<option name="groupId" value="com.jetbrains.intellij.goland" />
</LibraryCoordinatesState>
<LibraryCoordinatesState>
<option name="artifactId" value="goland" />
<option name="groupId" value="com.jetbrains" />
</LibraryCoordinatesState>
</list>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="appsflyer_advert_new_flink" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" type="JAVA_MODULE" version="4" />
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
buildscript {
repositories {
mavenCentral()
}
}
apply plugin: "java"
apply plugin: "application"
group 'com.fshark.overseas.advert'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
ext {
javaVersion = '1.8'
flinkVersion = '1.11.1'
scalaBinaryVersion = '2.12'
slf4jVersion = '1.7.7'
log4jVersion = '1.2.17'
}
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
//applicationDefaultJvmArgs = ["-Dlog4j.configuration=log4j.properties"]
mainClassName = 'com.fshark.overseas.advert.AppsflyerAnalyze'
repositories {
mavenCentral()
}
// NOTE: We cannot use "compileOnly" or "shadow" configurations since then we could not run code
// in the IDE or with "gradle run". We also cannot exclude transitive dependencies from the
// shadowJar yet (see https://github.com/johnrengelman/shadow/issues/159).
// -> Explicitly define the // libraries we want to be included in the "flinkShadowJar" configuration!
configurations {
flinkShadowJar // dependencies which go into the shadowJar
// always exclude these (also from transitive dependencies) since they are provided by Flink
flinkShadowJar.exclude group: 'org.apache.flink', module: 'force-shading'
flinkShadowJar.exclude group: 'com.google.code.findbugs', module: 'jsr305'
flinkShadowJar.exclude group: 'org.slf4j'
flinkShadowJar.exclude group: 'log4j'
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
compile 'com.github.ben-manes.caffeine:caffeine:2.8.5'
compile 'com.zaxxer:HikariCP:3.4.5'
compile group: 'org.jdbi', name: 'jdbi3-core', version: '3.18.0'
compile group: 'org.jdbi', name: 'jdbi3-sqlobject', version: '3.18.0'
compile 'redis.clients:jedis:3.5.1'
compile 'com.squareup.okhttp3:okhttp:3.14.1'
implementation 'com.google.code.gson:gson:2.8.4'
compile 'com.alibaba:fastjson:1.2.62'
compile "org.apache.flink:flink-connector-kafka_${scalaBinaryVersion}:${flinkVersion}"
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
compile "org.apache.flink:flink-statebackend-rocksdb_${scalaBinaryVersion}:${flinkVersion}"
compile "org.apache.flink:flink-java:${flinkVersion}"
compile "org.apache.flink:flink-streaming-java_${scalaBinaryVersion}:${flinkVersion}"
compile "org.apache.flink:flink-clients_${scalaBinaryVersion}:${flinkVersion}"
implementation 'ru.yandex.clickhouse:clickhouse-jdbc:0.1.52'
// --------------------------------------------------------------
// Dependencies that should be part of the shadow jar, e.g.
// connectors. These must be in the flinkShadowJar configuration!
// --------------------------------------------------------------
//flinkShadowJar "org.apache.flink:flink-connector-kafka-0.11_${scalaBinaryVersion}:${flinkVersion}"
compile "org.springframework:spring-beans:5.1.6.RELEASE"
compileOnly "log4j:log4j:${log4jVersion}"
compileOnly "org.slf4j:slf4j-log4j12:${slf4jVersion}"
compileOnly 'org.projectlombok:lombok:1.18.18'
annotationProcessor 'org.projectlombok:lombok:1.18.18'
testCompileOnly 'org.projectlombok:lombok:1.18.18'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.18'
// Add test dependencies here.
testCompile group: 'it.ozimov', name: 'embedded-redis', version: '0.7.2'
testCompile "org.mockito:mockito-core:2.+"
testCompile "org.apache.flink:flink-test-utils_${scalaBinaryVersion}:${flinkVersion}"
}
test {
useJUnitPlatform()
}
// make compileOnly dependencies available for tests:
sourceSets {
main.compileClasspath += configurations.flinkShadowJar
main.runtimeClasspath += configurations.flinkShadowJar
test.compileClasspath += configurations.flinkShadowJar
test.runtimeClasspath += configurations.flinkShadowJar
javadoc.classpath += configurations.flinkShadowJar
}
run.classpath = sourceSets.main.runtimeClasspath
jar {
manifest {
attributes 'Built-By': System.getProperty('user.name'),
'Build-Jdk': System.getProperty('java.version')
}
}
com/fshark/overseas/advert/modle/AppsFlyerWithAccountEvent.java
com.fshark.overseas.advert.modle.AppsFlyerWithAccountEvent
com/fshark/overseas/advert/modle/PlatformEnum.java
com.fshark.overseas.advert.modle.PlatformEnum
com/fshark/overseas/advert/util/Common.java
com.fshark.overseas.advert.util.Common
com/fshark/overseas/advert/util/AppConfig.java
com.fshark.overseas.advert.util.AppConfig
com.fshark.overseas.advert.util.AppConfig$AppConfigBuilder
com/fshark/overseas/advert/entity/dao/MetricsDetailDao.java
com.fshark.overseas.advert.entity.dao.MetricsDetailDao
com/fshark/overseas/advert/entity/RegisterAccount.java
com.fshark.overseas.advert.entity.RegisterAccount
com.fshark.overseas.advert.entity.RegisterAccount$RegisterAccountBuilder
com/fshark/overseas/advert/processor/ActivationAggregateFunction.java
com.fshark.overseas.advert.processor.ActivationAggregateFunction
com/fshark/overseas/advert/modle/mapping/Media.java
com.fshark.overseas.advert.modle.mapping.Media
com.fshark.overseas.advert.modle.mapping.Media$MediaBuilder
com/fshark/overseas/advert/entity/dao/OrderDao.java
com.fshark.overseas.advert.entity.dao.OrderDao
com/fshark/overseas/advert/entity/mapper/RegisterAccountMapper.java
com.fshark.overseas.advert.entity.mapper.RegisterAccountMapper
com/fshark/overseas/advert/entity/GameAccount.java
com.fshark.overseas.advert.entity.GameAccount
com.fshark.overseas.advert.entity.GameAccount$GameAccountBuilder
com/fshark/overseas/advert/util/DatabaseUtils.java
com.fshark.overseas.advert.util.DatabaseUtils
com/fshark/overseas/advert/entity/dao/GameMappingDao.java
com.fshark.overseas.advert.entity.dao.GameMappingDao
com/fshark/overseas/advert/modle/metrics/ActivationMetrics.java
com.fshark.overseas.advert.modle.metrics.ActivationMetrics
com/fshark/overseas/advert/modle/metrics/BaseMetrics.java
com.fshark.overseas.advert.modle.metrics.BaseMetrics
com/fshark/overseas/advert/modle/mapping/AdMapping.java
com.fshark.overseas.advert.modle.mapping.AdMapping
com/fshark/overseas/advert/modle/AppsflyerRoleLogin.java
com.fshark.overseas.advert.modle.AppsflyerRoleLogin
com/fshark/overseas/advert/util/JdbiContext.java
com.fshark.overseas.advert.util.JdbiContext
com/fshark/overseas/advert/processor/GameAdMappingProcessor.java
com.fshark.overseas.advert.processor.GameAdMappingProcessor
com/fshark/overseas/advert/util/RedisClientUtils.java
com.fshark.overseas.advert.util.RedisClientUtils
com/fshark/overseas/advert/processor/ActivitionProcess.java
com.fshark.overseas.advert.processor.ActivitionProcess
com/fshark/overseas/advert/processor/StoreMetricProcess.java
com.fshark.overseas.advert.processor.StoreMetricProcess
com/fshark/overseas/advert/sink/PurchaseSink.java
com.fshark.overseas.advert.sink.PurchaseSink
com/fshark/overseas/advert/modle/mapping/MediaCampaign.java
com.fshark.overseas.advert.modle.mapping.MediaCampaign
com/fshark/overseas/advert/modle/OrderData.java
com.fshark.overseas.advert.modle.OrderData
com/fshark/overseas/advert/modle/AppsFlyerEvent.java
com.fshark.overseas.advert.modle.AppsFlyerEvent
com/fshark/overseas/advert/processor/ParseEventProcessor.java
com.fshark.overseas.advert.processor.ParseEventProcessor
com/fshark/overseas/advert/processor/CreateRoleProcess.java
com.fshark.overseas.advert.processor.CreateRoleProcess
com/fshark/overseas/advert/processor/ActivationResultWindows.java
com.fshark.overseas.advert.processor.ActivationResultWindows
com/fshark/overseas/advert/util/DateUtils.java
com.fshark.overseas.advert.util.DateUtils
com/fshark/overseas/advert/util/Constants.java
com.fshark.overseas.advert.util.Constants
com/fshark/overseas/advert/processor/RemainProcess.java
com.fshark.overseas.advert.processor.RemainProcess
com/fshark/overseas/advert/modle/AppsflyerPurchase.java
com.fshark.overseas.advert.modle.AppsflyerPurchase
com/fshark/overseas/advert/modle/EventTypeEnum.java
com.fshark.overseas.advert.modle.EventTypeEnum
com/fshark/overseas/advert/util/DateTimeUtils.java
com.fshark.overseas.advert.util.DateTimeUtils
com/fshark/overseas/advert/entity/mapper/GameAccountMapper.java
com.fshark.overseas.advert.entity.mapper.GameAccountMapper
com/fshark/overseas/advert/processor/RoleLoginProcess.java
com.fshark.overseas.advert.processor.RoleLoginProcess
com/fshark/overseas/advert/modle/metrics/RemainMetrics.java
com.fshark.overseas.advert.modle.metrics.RemainMetrics
com/fshark/overseas/advert/entity/dao/GameAccountDao.java
com.fshark.overseas.advert.entity.dao.GameAccountDao
com/fshark/overseas/advert/modle/mapping/Game.java
com.fshark.overseas.advert.modle.mapping.Game
com/fshark/overseas/advert/util/ClickFeedbackRecord.java
com.fshark.overseas.advert.util.ClickFeedbackRecord
com.fshark.overseas.advert.util.ClickFeedbackRecord$ClickFeedbackRecordBuilder
com/fshark/overseas/advert/entity/mapper/MediaMapper.java
com.fshark.overseas.advert.entity.mapper.MediaMapper
com/fshark/overseas/advert/sink/RemainSink.java
com.fshark.overseas.advert.sink.RemainSink
com/fshark/overseas/advert/AppsflyerAnalyze.java
com.fshark.overseas.advert.AppsflyerAnalyze
com/fshark/overseas/advert/entity/dao/MetricsDao.java
com.fshark.overseas.advert.entity.dao.MetricsDao
com/fshark/overseas/advert/sink/ActicitionSink.java
com.fshark.overseas.advert.sink.ActicitionSink
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
rootProject.name = 'appsflyer_advert_new_flink'
Manifest-Version: 1.0
Main-Class: com.fshark.overseas.advert.AppsflyerAnalyze
package com.fshark.overseas.advert;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.EventTypeEnum;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.RemainMetrics;
import com.fshark.overseas.advert.processor.*;
import com.fshark.overseas.advert.sink.ActicitionSink;
import com.fshark.overseas.advert.sink.PurchaseSink;
import com.fshark.overseas.advert.sink.RemainSink;
import com.fshark.overseas.advert.util.AppConfig;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
/**
* 广告计算
*/
public class AppsflyerAnalyze {
static AppConfig loadConfigFromArgs(String[] args) throws Exception {
ParameterTool parameters = ParameterTool.fromArgs(args);
AppConfig appConfig = new AppConfig();
try {
appConfig.setSourceKafkaBootstrapServers(parameters.get("source-kafka-bootstrap-servers"));
appConfig.setSourceKafkaGroupId(parameters.get("source-kafka-group-id"));
appConfig.setSourceKafkaTopic(parameters.get("source-kafka-topic"));
appConfig.setDbHost(parameters.get("jdbc-host"));
appConfig.setDbUser(parameters.get("jdbc-user"));
appConfig.setDbPassword(parameters.get("jdbc-password"));
} catch (Exception e) {
System.err.println("Place set args: " +
" --source-kafka-bootstrap-servers <source-kafka-bootstrap-servers>" +
" --source-kafka-group-id <source-kafka-group-id>" +
" --source-kafka-topic <source-kafka-topic>" +
" --jdbc-host <jdbc-host> " +
" --jdbc-user <jdbc-user> " +
" --jdbc-password <jdbc-password> ");
throw e;
}
return appConfig;
}
public static void main(String[] args) throws Exception {
AppConfig appConfig = loadConfigFromArgs(args);
final StreamExecutionEnvironment sse = StreamExecutionEnvironment.getExecutionEnvironment();
sse.setParallelism(1);
sse.enableCheckpointing(1000 * 60 * 10);
sse.setRestartStrategy(RestartStrategies.fixedDelayRestart(Integer.MAX_VALUE, org.apache.flink.api.common.time.Time.of(10, TimeUnit.SECONDS)));
//source设置
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", appConfig.getSourceKafkaBootstrapServers());
properties.setProperty("group.id", appConfig.getSourceKafkaGroupId());
properties.setProperty("auto.offset.reset", "earliest");
FlinkKafkaConsumer<String> dataConsumer = new FlinkKafkaConsumer<>(appConfig.getSourceKafkaTopic(), new SimpleStringSchema(), properties);
DataStream<AppsFlyerEvent> adEventDataStream = sse.addSource(dataConsumer)
.flatMap(new ParseEventProcessor())
.uid("parse-event")
.name("parse-event")
.shuffle();
adEventDataStream.print();
//广告指标(激活)
DataStream<ActivationMetrics> activitionMetricStream = adEventDataStream
.filter(EventTypeEnum::installEvent)
.flatMap(new ActivitionProcess(appConfig))
.uid("activition-event")
.name("activition-event");
DataStream<ActivationMetrics> createRoleMetricStream = adEventDataStream
.filter(EventTypeEnum::createRoleEvent)
.flatMap(new CreateRoleProcess(appConfig))
.uid("create-role-event")
.name("create-role-event");
//注册\留存
DataStream<ActivationMetrics> loginRoleMetricStream = adEventDataStream
.filter(EventTypeEnum::roleLoginEvent)
.flatMap(new RoleLoginProcess(appConfig))
.uid("role-login-event")
.name("role-login-event");
//角色注册激活预聚合
DataStream<ActivationMetrics> activitionResult = activitionMetricStream
.union(loginRoleMetricStream, createRoleMetricStream)
.keyBy(ActivationMetrics::getKey)
.window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
.aggregate(new ActivationAggregateFunction(), new ActivationResultWindows())
.uid("activation-agg-event")
.name("activation-agg-event");
// 角色注册激活写入
activitionResult.addSink(new ActicitionSink(appConfig))
.uid("login-sink-event")
.name("login-sink-event");
//
// //指标详细记录
activitionMetricStream.union(loginRoleMetricStream, createRoleMetricStream)
.timeWindowAll(Time.minutes(1)).process(new StoreMetricProcess(appConfig))
.uid("metric-detail")
.name("metric-detail");
//// 留存预聚合
DataStream<RemainMetrics> remainResult = loginRoleMetricStream.flatMap(new RemainProcess())
.keyBy(RemainMetrics::getRemind_key)
.window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
.sum("user_num")
.uid("remain-event")
.name("remain-event");
//留存写入
remainResult.addSink(new RemainSink(appConfig))
.uid("remain-sink-event")
.name("remain-sink-event");
// 订单信息
adEventDataStream.filter(EventTypeEnum::orderEvent)
.addSink(new PurchaseSink(appConfig))
.uid("order-event")
.name("order-event");
sse.execute("appsflyer-analyze");
}
}
package com.fshark.overseas.advert.entity;
import lombok.Builder;
import lombok.Data;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Builder
@Data
public class GameAccount {
private String did;
private String gameId;
private String platform;
private String mediaSource;
private String event_type;
private String event_time;
}
package com.fshark.overseas.advert.entity;
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class RegisterAccount {
private String reg_time;
private String activationTime;
private String retargetingTime;
}
package com.fshark.overseas.advert.entity.dao;
import com.fshark.overseas.advert.entity.GameAccount;
import com.fshark.overseas.advert.entity.RegisterAccount;
import com.fshark.overseas.advert.entity.mapper.GameAccountMapper;
import com.fshark.overseas.advert.entity.mapper.RegisterAccountMapper;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import org.apache.kafka.common.protocol.types.Field;
import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import java.util.Optional;
public interface GameAccountDao {
/**
* 根据主键获取当前账户信息
*
* @param
* @return
*/
@SqlQuery("SELECT * FROM appsflyer_activation_devices WHERE game_id=:game_id AND uid=:uid And platform =:platform AND event_type =:event_type order by event_time limit 1")
@RegisterRowMapper(GameAccountMapper.class)
Optional<GameAccount> findByPrimary(@BindBean AppsFlyerEvent event, @Bind("event_type") String event_type);
@SqlUpdate("insert into appsflyer_activation_devices (`platform`,`did`, `uid`, `region`, `game_id`,`media_source`,`campaign_id`,`ad_set_id`,`ad_id`,`ip`, `time_zone`,`event_type`,`event_time`) " +
"values ( :platform,:did ,:uid, :region, :game_id, :media_source, :campaign_id,:ad_set_id, :ad_id, :ip, :time_zone,'activition',:reg_time) ")
void insertActivition(@BindBean AppsFlyerEvent event, @Bind("reg_time") String reg_time);
@SqlUpdate("insert into appsflyer_activation_devices (`platform`,`did`, `uid`, `region`, `game_id`,`media_source`,`campaign_id`,`ad_set_id`,`ad_id`,`ip`, `time_zone`,`event_type`,`event_time`) " +
" values ( :platform,:did ,:uid, :region, :game_id, :media_source, :campaign_id,:ad_set_id, :ad_id, :ip, :time_zone,'register',:reg_time ) ")
void insertRegister(@BindBean AppsFlyerEvent value, @Bind("reg_time") String reg_time);
@SqlUpdate("insert into appsflyer_activation_devices (`platform`,`did`, `uid`, `region`, `game_id`,`media_source`,`campaign_id`,`ad_set_id`,`ad_id`,`ip`, `time_zone`,`event_type`,`event_time`) " +
" values ( :platform,:did ,:uid, :region, :game_id, :media_source, :campaign_id,:ad_set_id, :ad_id, :ip, :time_zone,'rolelogin',:event_time ) ")
void insertRoleLogin(@BindBean AppsFlyerEvent value);
@SqlUpdate("insert into appsflyer_activation_devices (`platform`,`did`, `uid`, `region`, `game_id`,`media_source`,`campaign_id`,`ad_set_id`,`ad_id`,`ip`, `time_zone`,`event_type`,`event_time`) " +
" values ( :platform,:did ,:uid, :region, :game_id, :media_source, :campaign_id,:ad_set_id, :ad_id, :ip, :time_zone,'pauchase',:event_time ) ")
void insertPauchase(@BindBean AppsFlyerEvent value);
}
package com.fshark.overseas.advert.entity.dao;
import com.fshark.overseas.advert.entity.mapper.MediaMapper;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.mapping.Media;
import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import java.util.Optional;
/**
* 游戏广告相关的映射
*/
public interface GameMappingDao {
/**
* 拉取游戏
*/
@SqlQuery("select count(1) from game where platform_id = :platform_id and af_app_id = :game_id")
boolean findGameByPrimary(@BindBean AppsFlyerEvent event, @Bind("platform_id") int platform_id);
@SqlUpdate("insert into game (`platform_id`, `af_app_id`, `af_app_name`, `app_id`,`select_time_zone`) values (:platform_id,:game_id,:app_name,:app_id,:select_time_zone)")
void saveGame(@BindBean AppsFlyerEvent value, @Bind("platform_id") int platform_id);
@SqlQuery("select * from media where af_media_id = :media_source")
@RegisterRowMapper(MediaMapper.class)
Optional<Media> findMediaByPrimary(@BindBean AppsFlyerEvent value);
@SqlUpdate("insert into media (`af_media_id`) values (:media_source)")
void saveMediaSource(@BindBean AppsFlyerEvent value);
@SqlQuery("select count(1) from adgroup_media_mapping where af_media_id = :media_source and af_group_id = :campaign_id ")
boolean existsMediaCampaign(@BindBean AppsFlyerEvent appsFlyerEvent);
@SqlUpdate("insert into adgroup_media_mapping (`media_id`, `af_media_id`, `af_group_id`, `af_group_name`) values (:id, :media_source, :campaign_id, :campaign)")
void saveMediaCampaign(@BindBean AppsFlyerEvent appsFlyerEvent, @BindBean Media media);
@SqlUpdate("insert into ad_mapping (`media_id`, `af_media_id`, `af_ad_group_id`, `af_ad_group_name`, `af_ad_plan_id`, `af_ad_plan_name`, `af_ad_id`, `af_ad_name`) " +
" values (:id, :media_source , :campaign_id, :campaign, :ad_set_id, :ad_set, :ad_id, :ad) on duplicate key update af_ad_group_name = values(af_ad_group_name), af_ad_plan_name = values(af_ad_plan_name), af_ad_name = values(af_ad_name)")
void saveAdMapping(@BindBean AppsFlyerEvent appsFlyerEvent, @BindBean Media media);
}
package com.fshark.overseas.advert.entity.dao;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.RemainMetrics;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
/**
*
*/
public interface MetricsDao {
/**
* 更新指标表的注册创角等
* @param event
*/
@SqlUpdate("insert into appsflyer_metrics" +
" (`data_date`,`data_hour`,`time_zone`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`channel`,`data_activation`,`data_register`,`data_device_register`,`data_create_role`,`data_day_act_register`,`data_day_register_create`,`data_active_day_dau`,`data_type`)" +
" values (:data_date,:data_hour,:time_zone,:region,:platform,:game_id,:media_source,:campaign_id,:ad_set_id,:ad_id,:channel,:data_activation,:data_register,:data_device_register,:data_create_role,:data_day_act_register,:data_day_register_create,:data_active_day_dau,:data_type) ")
void insertActivationMetrics(@BindBean ActivationMetrics event);
@SqlUpdate("insert into appsflyer_retention " +
" (`data_date`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`currency`,`register_num`)" +
" values (:data_date,:region,:platform,:game_id,:media_source,:campaign_id,:ad_set_id,:ad_id,'KRW',:data_register)")
void insertRegisterNum(@BindBean ActivationMetrics event);
}
package com.fshark.overseas.advert.entity.dao;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
public interface MetricsDetailDao {
@SqlUpdate("insert into appsflyer_metrics_detail" +
" (`uid`,`data_date`,`data_hour`,`time_zone`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`channel`,`data_type`,`metric_name`,`metric_value`)" +
" values(:uid,:data_date,:data_hour,:time_zone,:region,:platform,:game_id,:media_source,:campaign_id,:ad_set_id,:ad_id,:channel,:data_type,:column,'1')")
void insertMetricDetail(@BindBean ActivationMetrics activationMetrics, @Bind("column") String column);
}
package com.fshark.overseas.advert.entity.dao;
import com.fshark.overseas.advert.modle.OrderData;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
public interface OrderDao {
@SqlUpdate("insert into appsflyer_pay_record (region, did, uid,platform, game_id, media_source, campaign_id, ad_set_id,ad_id, " +
" pay_time, money, currency, order_no, reg_time, activation_time, time_zone ,channel,data_type)" +
" values(:region, :did, :uid, :platform, :game_id, :media_source, :campaign_id, :ad_set_id , :ad_id," +
" :pay_time, :revenue,:currency,:orderno,:reg_time,:activation_time,:time_zone,:channel,:data_type)")
void insertOrder(@BindBean OrderData orderData);
// @SqlUpdate("insert into appsflyer_order_accumulative" +
// " (`ds`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`currency`,`%s`" +
// " values()")
// void insertLtv(@BindBean OrderData orderData, int pay_user);
}
package com.fshark.overseas.advert.entity.mapper;
import com.fshark.overseas.advert.entity.GameAccount;
import org.jdbi.v3.core.mapper.RowMapper;
import org.jdbi.v3.core.statement.StatementContext;
import java.sql.ResultSet;
import java.sql.SQLException;
public class GameAccountMapper implements RowMapper<GameAccount> {
@Override
public GameAccount map(ResultSet rs, StatementContext ctx) throws SQLException {
return GameAccount.builder()
.gameId(rs.getString("game_id"))
.did(rs.getString("did"))
.platform(rs.getString("platform"))
.mediaSource(rs.getString("media_source"))
.event_type(rs.getString("event_type"))
.event_time(rs.getString("event_time"))
.build();
}
}
package com.fshark.overseas.advert.entity.mapper;
import com.fshark.overseas.advert.modle.mapping.Media;
import org.jdbi.v3.core.mapper.RowMapper;
import org.jdbi.v3.core.statement.StatementContext;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MediaMapper implements RowMapper<Media> {
@Override
public Media map(ResultSet rs, StatementContext ctx) throws SQLException {
return Media.builder()
.media_source(rs.getString("af_media_id"))
.id(rs.getLong("id"))
.build();
}
}
package com.fshark.overseas.advert.entity.mapper;
import com.fshark.overseas.advert.entity.RegisterAccount;
import org.jdbi.v3.core.mapper.RowMapper;
import org.jdbi.v3.core.statement.StatementContext;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RegisterAccountMapper implements RowMapper<RegisterAccount> {
@Override
public RegisterAccount map(ResultSet rs, StatementContext ctx) throws SQLException {
return RegisterAccount.builder()
.activationTime(rs.getString("activation_time"))
.retargetingTime(rs.getString("retargeting_time"))
.reg_time(rs.getString("reg_time"))
.build();
}
}
package com.fshark.overseas.advert.modle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fshark.overseas.advert.util.Constants;
import com.fshark.overseas.advert.util.DateUtils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.shaded.curator4.com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author zhouml [zhouml@kingnet.com]
* @date 2019-03-01
*/
@Data
public class AppsFlyerEvent implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(AppsFlyerEvent.class);
/**
* 事件 createrole/sdk login/fast login
*/
private String event;
/**
* in-app-event
* install
*/
private String event_type;
/**
* country_code
* install
*/
private String region;
/**
* appsflyer_device_id
* install
*/
private String appsflyer_device_id;
/**
* 日志时间(ms)
*/
private Date event_time;
/**
* json event_value
*/
private String event_value;
/**
* 日志时区 +0900
*/
private String time_zone;
private String select_time_zone;
/**
* 用户唯一标识 appsflyer_device_id
*/
private String uid;
/**
* 设备唯一标识
* ios --> idfa
* android --> advertising
*/
private String did;
/**
* 平台
* android | ios
*/
private String platform;
/**
* 媒体平台
* media_source &&
* <p>
* googleadwords_int | Facebook Ad
*/
private String media_source;
/**
* 游戏ID bundle_id
*/
private String game_id;
/**
* 游戏对应名称 --> 새 천하를 열다 | 새 천하를 열다
*/
private String app_name;
/**
* App Id --> com.edgames.newworld | id1280877546
*/
private String app_id;
/**
* 广告计划ID
*/
private String campaign_id;
/**
* 广告计划
*/
private String campaign;
/**
* 广告组(计划)ID
*/
private String ad_set_id;
/**
* 广告组(计划)
*/
private String ad_set;
/**
* 广告ID
*/
private String ad_id;
/**
* 广告
*/
private String ad;
/**
* 渠道
*/
private String channel;
/**
* 订单编号
*/
private String orderno;
/**
* 货币单位 currency
*/
private String currency;
/**
* 收益 revenue_in_selected_currency
*/
private Double revenue;
/**
* ip地址
*/
private String ip;
/**
* 错误的原因,日志解析错误 | 某些计算字段缺失
*/
private String error_reason;
/**
* 客服端ID 上报用于???
*/
private String customer_user_id;
/**
* 再营销数据
*/
private Boolean is_retargeting = false;
private static List<String> validation_fields =
Lists.newArrayList(
"event_time_selected_timezone", "platform", "bundle_id", "event_type", "event_name",
"appsflyer_device_id", "imei", "idfa", "media_source"
);
public static String nvl(String first, String defaultValue) {
if (StringUtils.isNotBlank(first)) {
return first;
} else {
return defaultValue;
}
}
public static String nvl(String first, String second, String defaultValue) {
if (StringUtils.isNotBlank(first)) {
return first;
} else if (StringUtils.isNotBlank(second)) {
return second;
} else {
return defaultValue;
}
}
/**
* 如果是应用内事件, 则取event_name
* xxx 创角有一个特殊的情况需要考虑 創角(ios)发送的
* <p>
* 如果是激活事件, 则取event_type
*
* @param eventType
* @param eventName
* @return
*/
private static String getEvent(JSONObject jsonObject, String eventType, String eventName) {
return jsonObject.containsKey("api_version") &&
"2.0".equals(jsonObject.getString("api_version")) ?
getEventV2(eventName) :
getEventV1(eventType, eventName);
}
private static String getEventV1(String eventType, String eventName) {
if ("in-app-event".equals(eventType)) {
return eventName.equals("創角") ? EventTypeEnum.CREATE_ROLE.getName() : eventName.toLowerCase();
} else if (EventTypeEnum.ACTIVATION.getName().equals(eventType)) {
return eventType.toLowerCase();
} else {
return Constants.DEFAULT_FIELD_VALUE;
}
}
private static String getEventV2(String eventName) {
return "創角".equals(eventName) ? EventTypeEnum.CREATE_ROLE.getName() : eventName.toLowerCase();
}
/**
* 如果是android, 则使用advertising_id
* 如果是ios, 则使用idfa
*
* @param jsonObject
* @param appsFlyerEvent
*/
private static void setDidByType(AppsFlyerEvent appsFlyerEvent, JSONObject jsonObject) {
String advertisingId = jsonObject.getString("advertising_id");
String idfa = jsonObject.getString("idfa");
if (StringUtils.isBlank(idfa)) {
idfa = jsonObject.getString("idfv");
}
String platform = jsonObject.getString("platform");
String did;
if (PlatformEnum.IOS.getName().equals(platform)) {
did = nvl(idfa, Constants.DEFAULT_FIELD_VALUE);
} else if (PlatformEnum.Android.getName().equals(platform)) {
did = nvl(advertisingId, Constants.DEFAULT_FIELD_VALUE);
} else {
did = Constants.DEFAULT_FIELD_VALUE;
}
appsFlyerEvent.setDid(did);
}
/**
* 设置广告相关的属性
* <p>
* FB的广告是有正常的三级的
* 而非FB的(谷歌的, SinoInteractive)广告只有一级
*
* @param appsFlyerEvent
* @param jsonObject
*/
private static void setAdByType(AppsFlyerEvent appsFlyerEvent, JSONObject jsonObject) {
String media_source = getMediaSource(jsonObject);
String campaign_id;
String campaign;
String ad_set_id;
String ad_set;
String ad_id;
String ad;
if (media_source.equals("facebook ads")) {
String fbCampaign = jsonObject.getString("fb_campaign_id");
String fbCampaignName = jsonObject.getString("fb_campaign_name");
String fbAdSet = jsonObject.getString("fb_adset_id");
String fbAdSetName = jsonObject.getString("fb_adset_name");
String fbAd = jsonObject.getString("fb_adgroup_id");
String fbAdName = jsonObject.getString("fb_adgroup_name");
campaign_id = nvl(fbCampaign, Constants.DEFAULT_FIELD_VALUE);
campaign = nvl(fbCampaignName, Constants.DEFAULT_FIELD_VALUE);
ad_set_id = nvl(fbAdSet, Constants.DEFAULT_FIELD_VALUE);
ad_set = nvl(fbAdSetName, Constants.DEFAULT_FIELD_VALUE);
ad_id = nvl(fbAd, Constants.DEFAULT_FIELD_VALUE);
ad = nvl(fbAdName, Constants.DEFAULT_FIELD_VALUE);
} else {
String nonFBCampaign = jsonObject.getString("af_c_id");
String nonFBCampaignName = jsonObject.getString("campaign");
String nonFBAdSet = jsonObject.getString("af_adset_id");
String nonFBAdSetName = jsonObject.getString("af_adset");
String nonFBAd = jsonObject.getString("af_ad_id");
String nonFBAdName = jsonObject.getString("af_ad");
campaign_id = nvl(nonFBCampaign, Constants.DEFAULT_FIELD_VALUE);
campaign = nvl(nonFBCampaignName, Constants.DEFAULT_FIELD_VALUE);
ad_set_id = nvl(nonFBAdSet, Constants.DEFAULT_FIELD_VALUE);
ad_set = nvl(nonFBAdSetName, Constants.DEFAULT_FIELD_VALUE);
ad_id = nvl(nonFBAd, Constants.DEFAULT_FIELD_VALUE);
ad = nvl(nonFBAdName, Constants.DEFAULT_FIELD_VALUE);
}
//有的渠道Campaign有值但是campaign_id没有值,做这个兼容设置
String modifiedCampaign = "None".equals(campaign) ? Constants.DEFAULT_FIELD_VALUE : campaign;
if (!Constants.DEFAULT_FIELD_VALUE.equals(modifiedCampaign) && Constants.DEFAULT_FIELD_VALUE.equals(campaign_id)){
campaign_id = modifiedCampaign;
}
appsFlyerEvent.setCampaign_id(campaign_id);
appsFlyerEvent.setCampaign(modifiedCampaign);
appsFlyerEvent.setAd_set_id(ad_set_id);
appsFlyerEvent.setAd_set(ad_set);
appsFlyerEvent.setAd_id(ad_id);
appsFlyerEvent.setAd(ad);
}
private static String getMediaSource(JSONObject jsonObject) {
String media_source = nvl(
jsonObject.getString("media_source"),
jsonObject.getString("agency"),
Constants.DEFAULT_FIELD_VALUE
).toLowerCase();
return media_source;
}
/**
* appsflyer日志解析相关注意事项
* <p>
* ## 解析方面
* <p>
* + 如果是安装|激活,则需要从event_type(install)中取值
* + 其它事件(in-app event), 则需要从event_name中取值
* <p>
* ## 验证方面
* + event_time_selected_timezone 不能为空
* + event_type and event_name 不能同时为空
* + bundle_id(game_id) 不能为空
* + platform不能为空
*
* @param line
* @return
*/
public static AppsFlyerEvent parse(String line) {
try {
JSONObject jsonObject = JSON.parseObject(line);
compatibleVersion(jsonObject);
String eventTimeWithZone = jsonObject.getString("event_time_selected_timezone");
String selected_timezone = jsonObject.getString("selected_timezone");
String platform = jsonObject.getString("platform");
String gameId = jsonObject.getString("bundle_id");
String eventType = jsonObject.getString("event_type");
String eventName = jsonObject.getString("event_name");
Boolean is_retargeting = Boolean.parseBoolean(jsonObject.getString("is_retargeting"));
// String af_channel = String.valueOf(jsonObject.getOrDefault("af_channel", Constants.DEFAULT_FIELD_VALUE));
// TODO 这个地方如果对于同一账户,不同设备,会有问题,因为这个是appflyer 针对每个安装自动生成的唯一的ID
String uid = String.valueOf(jsonObject.getOrDefault("appsflyer_device_id", Constants.DEFAULT_FIELD_VALUE));
// 因国外政策限制,所以imei基本拿不到, 需要使用 advertising_id
String advertisingId = jsonObject.getString("advertising_id");
String idfa = jsonObject.getString("idfa");
if (StringUtils.isBlank(idfa)) {
idfa = jsonObject.getString("idfv");
}
String appsflyerDeviceId = Objects.toString(jsonObject.getString("appsflyer_device_id"), "-1");
// 获取来源,默认韩国
String region = Objects.toString(jsonObject.getString("country_code"), "-1");
if (StringUtils.isBlank(region)) {
region = "-1";
}
String media_source = getMediaSource(jsonObject);
if (
StringUtils.isBlank(eventTimeWithZone) ||
StringUtils.isBlank(platform) ||
StringUtils.isBlank(gameId) ||
(StringUtils.isBlank(eventType) && StringUtils.isBlank(eventName)) ||
(StringUtils.isBlank(uid) && StringUtils.isBlank(advertisingId) && StringUtils.isBlank(idfa)) ||
StringUtils.isBlank(media_source)
) {
logger.error(String.format("Invalid log, possible invalid fields (%s), line: %s", String.join(",", validation_fields), line));
return null;
}
AppsFlyerEvent appsFlyerEvent = new AppsFlyerEvent();
String event = getEvent(jsonObject, eventType, eventName);
appsFlyerEvent.setEvent_type(eventType);
String[] timeZoneParts = eventTimeWithZone.split("\\+");
Date eventTime = DateUtils.formatHMSSAsDate(timeZoneParts[0]);
// 如果有错,直接视为错误; +0900
String timeZone = eventTimeWithZone.substring(23);
String ip = jsonObject.getString("ip");
String currency = jsonObject.getString("selected_currency");
Double revenue = jsonObject.getDouble("revenue_in_selected_currency");
appsFlyerEvent.setEvent(event);
appsFlyerEvent.setEvent_time(eventTime);
appsFlyerEvent.setTime_zone(timeZone);
appsFlyerEvent.setSelect_time_zone(selected_timezone == null ? "+0900" : selected_timezone);
appsFlyerEvent.setRegion(region);
appsFlyerEvent.setUid(uid);
setDidByType(appsFlyerEvent, jsonObject);
appsFlyerEvent.setAppsflyer_device_id(appsflyerDeviceId);
appsFlyerEvent.setPlatform(platform.toLowerCase());
appsFlyerEvent.setGame_id(gameId);
appsFlyerEvent.setMedia_source(media_source);
setAdByType(appsFlyerEvent, jsonObject);
appsFlyerEvent.setCurrency(currency);
appsFlyerEvent.setRevenue(revenue);
appsFlyerEvent.setIp(ip);
appsFlyerEvent.setIs_retargeting(is_retargeting);
String af_channel = jsonObject.getString("af_channel");
if (StringUtils.isBlank(af_channel)) {
af_channel = Constants.DEFAULT_FIELD_VALUE;
}
appsFlyerEvent.setChannel(af_channel);
appsFlyerEvent.setApp_name(
Objects.toString(jsonObject.getString("app_name"), Constants.DEFAULT_FIELD_VALUE)
);
appsFlyerEvent.setEvent_value(
Objects.toString(jsonObject.getString("event_value"), Constants.DEFAULT_FIELD_VALUE)
);
appsFlyerEvent.setApp_id(
Objects.toString(jsonObject.getString("app_id"), Constants.DEFAULT_FIELD_VALUE)
);
appsFlyerEvent.setCustomer_user_id(
Objects.toString(jsonObject.getString("customer_user_id"), Constants.DEFAULT_FIELD_VALUE)
);
return appsFlyerEvent;
} catch (Exception e) {
logger.error("Failed to parse log: " + line, e);
}
return null;
}
public String toJson() {
return JSON.toJSONString(this);
}
public static AppsFlyerEvent fromJson(String json) {
return JSON.parseObject(json, AppsFlyerEvent.class);
}
/**
* 兼容 v1 v2,
* 主要逻辑: 对于v1 版本的日志不做变更, 对于 v2 版本的日志将其包装转换为 v1 的字段
* 字段变更: see https://support.appsflyer.com/hc/en-us/articles/207034356-Using-Push-API-V2-0-real-time-raw-data#migrate-v10v20
*
* @param jsonObject
*/
private static void compatibleVersion(JSONObject jsonObject) {
if (jsonObject.containsKey("api_version") &&
"2.0".equals(jsonObject.getString("api_version"))) {
// v2 版本的日志, 进行降版本操作, facebook 媒体的日志需要进行转换
if (getMediaSource(jsonObject).equals("facebook ads")) {
setAttribute(jsonObject, "fb_campaign_id", "af_c_id");
setAttribute(jsonObject, "fb_campaign_name", "campaign");
setAttribute(jsonObject, "fb_adset_id", "af_adset_id");
setAttribute(jsonObject, "fb_adset_name", "af_adset");
setAttribute(jsonObject, "fb_adgroup_id", "af_ad_id");
setAttribute(jsonObject, "fb_adgroup_name", "af_ad");
}
// 转换一些被改名的字段
setAttribute(jsonObject, "appsflyer_device_id", "appsflyer_id");
setAttribute(jsonObject, "agency", "af_prt");
}
}
private static void setAttribute(JSONObject jsonObject, String v1Col, String v2Col) {
jsonObject.put(v1Col, jsonObject.get(v2Col));
}
public boolean isInstallEvent(){
return EventTypeEnum.ROLE_LOGIN.equals(event);
}
}
\ No newline at end of file
package com.fshark.overseas.advert.modle;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class AppsFlyerWithAccountEvent extends AppsFlyerEvent {
/**
* 服务注册时间
*/
private String register_server_time;
/**
* 区服
*/
private String register_server_id;
/**
* 上次区服登录时间
*/
private String last_role_login_time;
/**
* 数据类型 1.新增 2.再营销 3.预注册
*/
private int data_type = 1;
private String role_id;
}
package com.fshark.overseas.advert.modle;
import lombok.Data;
@Data
public class AppsflyerPurchase {
/**
* appsflyer_id : 1617268324168-7014069328556002014
* advertising_id : a397f73f-2522-4722-b486-edb493a73648
* idfa :
* ouid : 161726882715613001
* did : ffffffff-ec1b-5350-ffff-ffffef05ac4a,unknown,01b876f77ac02302
* user_id : 161726882715613001
* openid : 161726882715613001
* roleid : 6065909e271bed34ab14d17d
* rolename : ud22cub780ub3c4ud2b8
* serverid : 8401
* currency : KRW
* revenue : 1200.00
* af_currency : KRW
* af_revenue : 1200.00
* type : 1
* orderid : 10061951141360659419cb6b0ZJZ1617269785
* itemid : com.khsanguo.shark.1200
* itemnum : 1
* productid : charge6
* platform_id : 2
* time : 1617269799
* ip : 125.184.219.179
* platform : android
* plat : 1
* gameid : 9
* bundle_id : com.ldsanguo.shark
* bundle_name : ub09cud22cuc0bcuad6d:10vs10
* app_id : 100016
* _res : 2046*1080
* _ip : 125.184.219.179
* _appver : 1.2.6
* _sdk : php
* _mfr : samsung
* terminal : android
* _wifi : true
* _model :
* macaddr :
* channel : mgsdk
* subchannel :
* _sdkserver : 1.6.0
* _os : android
* _osver : 11
*/
private String appsflyer_id;
private String advertising_id;
private String idfa;
private long ouid;
private String did;
private long user_id;
private long openid;
private String roleid;
private String rolename;
private String serverid;
private String currency;
private String revenue;
private String af_currency;
private double af_revenue;
private String type;
private String orderid;
private String itemid;
private int itemnum;
private String productid;
private String platform_id;
private String time;
private String ip;
private String platform;
private String plat;
private String gameid;
private String bundle_id;
private String bundle_name;
private String app_id;
private String _res;
private String _ip;
private String _appver;
private String _sdk;
private String _mfr;
private String terminal;
private String _wifi;
private String _model;
private String macaddr;
private String channel;
private String subchannel;
private String _sdkserver;
private String _os;
private String _osver;
public String getAppsflyer_id() {
return appsflyer_id;
}
public void setAppsflyer_id(String appsflyer_id) {
this.appsflyer_id = appsflyer_id;
}
public String getAdvertising_id() {
return advertising_id;
}
public void setAdvertising_id(String advertising_id) {
this.advertising_id = advertising_id;
}
public String getIdfa() {
return idfa;
}
public void setIdfa(String idfa) {
this.idfa = idfa;
}
public long getOuid() {
return ouid;
}
public void setOuid(long ouid) {
this.ouid = ouid;
}
public String getDid() {
return did;
}
public void setDid(String did) {
this.did = did;
}
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public long getOpenid() {
return openid;
}
public void setOpenid(long openid) {
this.openid = openid;
}
public String getRoleid() {
return roleid;
}
public void setRoleid(String roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public String getServerid() {
return serverid;
}
public void setServerid(String serverid) {
this.serverid = serverid;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getRevenue() {
return revenue;
}
public void setRevenue(String revenue) {
this.revenue = revenue;
}
public String getAf_currency() {
return af_currency;
}
public void setAf_currency(String af_currency) {
this.af_currency = af_currency;
}
public double getAf_revenue() {
return af_revenue;
}
public void setAf_revenue(double af_revenue) {
this.af_revenue = af_revenue;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getOrderid() {
return orderid;
}
public void setOrderid(String orderid) {
this.orderid = orderid;
}
public String getItemid() {
return itemid;
}
public void setItemid(String itemid) {
this.itemid = itemid;
}
public int getItemnum() {
return itemnum;
}
public void setItemnum(int itemnum) {
this.itemnum = itemnum;
}
public String getProductid() {
return productid;
}
public void setProductid(String productid) {
this.productid = productid;
}
public String getPlatform_id() {
return platform_id;
}
public void setPlatform_id(String platform_id) {
this.platform_id = platform_id;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public String getPlat() {
return plat;
}
public void setPlat(String plat) {
this.plat = plat;
}
public String getGameid() {
return gameid;
}
public void setGameid(String gameid) {
this.gameid = gameid;
}
public String getBundle_id() {
return bundle_id;
}
public void setBundle_id(String bundle_id) {
this.bundle_id = bundle_id;
}
public String getBundle_name() {
return bundle_name;
}
public void setBundle_name(String bundle_name) {
this.bundle_name = bundle_name;
}
public String getApp_id() {
return app_id;
}
public void setApp_id(String app_id) {
this.app_id = app_id;
}
public String get_res() {
return _res;
}
public void set_res(String _res) {
this._res = _res;
}
public String get_ip() {
return _ip;
}
public void set_ip(String _ip) {
this._ip = _ip;
}
public String get_appver() {
return _appver;
}
public void set_appver(String _appver) {
this._appver = _appver;
}
public String get_sdk() {
return _sdk;
}
public void set_sdk(String _sdk) {
this._sdk = _sdk;
}
public String get_mfr() {
return _mfr;
}
public void set_mfr(String _mfr) {
this._mfr = _mfr;
}
public String getTerminal() {
return terminal;
}
public void setTerminal(String terminal) {
this.terminal = terminal;
}
public String get_wifi() {
return _wifi;
}
public void set_wifi(String _wifi) {
this._wifi = _wifi;
}
public String get_model() {
return _model;
}
public void set_model(String _model) {
this._model = _model;
}
public String getMacaddr() {
return macaddr;
}
public void setMacaddr(String macaddr) {
this.macaddr = macaddr;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getSubchannel() {
return subchannel;
}
public void setSubchannel(String subchannel) {
this.subchannel = subchannel;
}
public String get_sdkserver() {
return _sdkserver;
}
public void set_sdkserver(String _sdkserver) {
this._sdkserver = _sdkserver;
}
public String get_os() {
return _os;
}
public void set_os(String _os) {
this._os = _os;
}
public String get_osver() {
return _osver;
}
public void set_osver(String _osver) {
this._osver = _osver;
}
}
package com.fshark.overseas.advert.modle;
public class AppsflyerRoleLogin {
/**
* ouid : 161726882715613001
* roleid : 6065909e271bed34ab14d17d
* rolename : 주공1200291
* ip : 192.168.219.106
* serverid : 8401
*/
private String ouid;
private String roleid;
private String rolename;
private String ip;
private String serverid;
public String getOuid() {
return ouid;
}
public void setOuid(String ouid) {
this.ouid = ouid;
}
public String getRoleid() {
return roleid;
}
public void setRoleid(String roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getServerid() {
return serverid;
}
public void setServerid(String serverid) {
this.serverid = serverid;
}
}
package com.fshark.overseas.advert.modle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhouml [zhouml@kingnet.com]
* @date 2019-03-01
*/
public enum EventTypeEnum {
/*
第一次创角作为注册
*/
REGISTER("createrole"),
CREATE_ROLE("createrole"),
SDK_LOGIN("sdk login"),
FAST_LOGIN("fast login"),
GAME_LOGIN("gamelogin"),
ROLE_LOGIN("rolelogin"),
ACTIVATION("install"),
PURCHASE("af_purchase"),
RE_ENGAGEMENT("re-engagement"),
RE_ATTRIBUTION("re-attribution"),
LV_2("lv 2");
private String name;
EventTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static List<String> getEvents() {
return Arrays.stream(values()).map(EventTypeEnum::getName).distinct().collect(Collectors.toList());
}
public static boolean roleLoginEvent(AppsFlyerEvent event) {
return ROLE_LOGIN.getName().equals(event.getEvent());
}
public static boolean createRoleEvent(AppsFlyerEvent event) {
return CREATE_ROLE.getName().equals(event.getEvent());
}
public static boolean installEvent(AppsFlyerEvent event) {
return ACTIVATION.getName().equals(event.getEvent()) || RE_ENGAGEMENT.getName().equals(event.getEvent()) || RE_ATTRIBUTION.getName().equals(event.getEvent());
}
public static boolean orderEvent(AppsFlyerEvent event) {
return PURCHASE.getName().equals(event.getEvent());
}
}
package com.fshark.overseas.advert.modle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fshark.overseas.advert.util.DateUtils;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Locale;
/**
* @author yangjun
* @date 19/3/6 13:22
* Description:
*/
@Data
public class OrderData implements Serializable {
/**
* 事件 af_purchase
*/
private String event;
/**
* 日志时间(ms)
*/
private Date event_time;
/**
* json event_value
*/
private String event_value;
/**
* 日志时间(ms)
*/
private String time_zone;
/**
* 用户唯一标识 appsflyer_device_id
*/
private String uid;
/**
* 设备唯一标识
* ios --> idfa
* android --> advertising
*/
private String did;
/**
* 平台
* android | ios
*/
private String platform;
/**
* 媒体平台
* googleadwords_int | Facebook Ad
*/
private String media_source;
/**
* 游戏ID bundle_id
*/
private String game_id;
/**
* 游戏对应名称
*/
private String app_name;
/**
* 广告计划ID
*/
private String campaign_id;
/**
* 广告计划
*/
private String campaign;
/**
* 广告组(计划)ID
*/
private String ad_set_id;
/**
* 广告组(计划)
*/
private String ad_set;
/**
* 广告ID
*/
private String ad_id;
/**
* 广告
*/
private String ad;
/**
* 地区
*/
private String region;
/**
* 渠道
*/
private String channel;
/**
* 订单编号,根据数据生成,md5(uid|gameId|time|money)
*/
private String orderno;
/**
* 货币单位 currency
*/
private String currency;
/**
* 收益 revenue_in_selected_currency
*/
private Double revenue;
private String pay_time;
/**
* 注册时间
*/
private String reg_time;
/**
* 激活时间
*/
private String activation_time;
/**
* 再营销时间
*/
private String retargeting_time;
private int data_hour;
private Long reg_date;
private int data_type;
public OrderData(AppsFlyerEvent appsFlyerEvent) {
this.uid = appsFlyerEvent.getUid();
this.game_id = appsFlyerEvent.getGame_id();
this.event = appsFlyerEvent.getEvent();
this.event_time = appsFlyerEvent.getEvent_time();
this.event_value = appsFlyerEvent.getEvent_value();
this.time_zone = appsFlyerEvent.getTime_zone();
this.did = appsFlyerEvent.getDid();
this.platform = appsFlyerEvent.getPlatform();
this.media_source = appsFlyerEvent.getMedia_source();
this.app_name = appsFlyerEvent.getApp_name();
this.campaign = appsFlyerEvent.getCampaign();
this.campaign_id = appsFlyerEvent.getCampaign_id();
this.ad_set = appsFlyerEvent.getAd_set();
this.ad_set_id = appsFlyerEvent.getAd_set_id();
this.ad = appsFlyerEvent.getAd();
this.ad_id = appsFlyerEvent.getAd_id();
this.channel = appsFlyerEvent.getChannel();
this.pay_time = DateUtils.formatAsYMDHMS(appsFlyerEvent.getEvent_time());
JSONObject json = JSON.parseObject(event_value);
this.currency = json.getString("af_currency");
this.revenue = Double.valueOf(json.getString("af_revenue"));
// this.orderno = getOrderUniqueId();
this.orderno = json.getString("orderid");
this.region = appsFlyerEvent.getRegion();
this.setData_type(1);
if (appsFlyerEvent.getIs_retargeting()) { //再营销数据
this.setData_type(2);
}
if (appsFlyerEvent.getCampaign().toLowerCase(Locale.ROOT).startsWith("acp")) { //预注册数据
this.setData_type(3);
}
}
public String toJson() {
return JSON.toJSONString(this);
}
}
package com.fshark.overseas.advert.modle;
/**
* @author zhouml [zhouml@kingnet.com]
* @date 2019-03-07
*/
public enum PlatformEnum {
IOS("ios"),
Android("android");
PlatformEnum(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
}
package com.fshark.overseas.advert.modle.mapping;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class AdMapping implements Serializable {
private String af_ad_group_id;
private String af_ad_plan_id;
private String af_ad_id;
}
package com.fshark.overseas.advert.modle.mapping;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Game {
private Integer platformId;
private String afAppId;
}
\ No newline at end of file
package com.fshark.overseas.advert.modle.mapping;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Builder
@Data
@AllArgsConstructor
public class Media {
private Long id;
private String media_source;
}
package com.fshark.overseas.advert.modle.mapping;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class MediaCampaign {
private String media_source;
private String campaign;
}
package com.fshark.overseas.advert.modle.metrics;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
@Data
public class ActivationMetrics extends BaseMetrics {
private String uid;
/**
* 激活数 按唯一设备去重
*/
private Long data_activation =0L;
/**
* 注册数 按唯一用户去重
*/
private Long data_register = 0L;
/**
* 设备注册数
*/
private Long data_device_register = 0L;
/**
* 创角数 (不去重的)
*/
private Long data_create_role = 0L;
/**
* 当日激活 并且当日注册数
*/
private Long data_day_act_register = 0L;
/**
* 当日注册 并且当日创角数
*/
private Long data_day_register_create = 0L;
/**
* 当日登录用户,排除当日注册用户
*/
private Long data_active_day_dau = 0L;
/**
* 留存天数
*/
private Long dateRemind = 0L;
}
package com.fshark.overseas.advert.modle.metrics;
import com.google.gson.Gson;
import lombok.Data;
import java.io.Serializable;
@Data
public class BaseMetrics implements Serializable {
/**
* 日期 20190228
*/
private Long data_date;
/**
* 小时 13
*/
private Integer data_hour;
/**
* 时区 +0900
*/
private String time_zone;
/**
* 媒体平台 googleadwords_int
*/
private String media_source;
/**
* 平台 Android|IOS
*/
private String platform;
/**
* 游戏ID bundle_id, com.edgames.new19gp
*/
private String game_id;
/**
* 广告系列ID 23843308705120641
*/
private String campaign_id;
/**
* 广告组|计划ID 23843308705230641
*/
private String ad_set_id;
/**
* 广告ID 23843308708070641
*/
private String ad_id;
/**
* 韩国KR, 香港 HK, 台湾 TW, 其它:-1,或者其它值
*/
private String region;
/**
* 渠道
*/
private String channel;
/**
* 数据类型 1.新增 2.再营销 3.预注册
*/
private int data_type = 1;
public String getKey() {
return new Gson().toJson(this);
}
public static BaseMetrics setKey(String keys) {
return new Gson().fromJson(keys,BaseMetrics.class);
}
}
package com.fshark.overseas.advert.modle.metrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class RemainMetrics extends BaseMetrics {
/**
* 留存时间
*/
private Long days;
/**
* 留存人数
*/
private Long user_num;
public String getRemind_key() {
return String.format("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s",getData_date(),getTime_zone(),getRegion(),getMedia_source(),getPlatform(),getGame_id(),getCampaign_id(),getAd_set_id(),getAd_id(),getChannel(),getDays());
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import org.apache.flink.api.common.functions.AggregateFunction;
public class ActivationAggregateFunction implements AggregateFunction<ActivationMetrics,ActivationMetrics,ActivationMetrics> {
@Override
public ActivationMetrics createAccumulator() {
return new ActivationMetrics();
}
@Override
public ActivationMetrics add(ActivationMetrics value, ActivationMetrics accumulator) {
value.setData_activation(value.getData_activation() + accumulator.getData_activation());
value.setData_register(accumulator.getData_register() + value.getData_register());
value.setData_device_register(accumulator.getData_device_register() + value.getData_device_register());
value.setData_create_role(accumulator.getData_create_role() + value.getData_create_role());
value.setData_day_act_register(accumulator.getData_day_act_register() + value.getData_day_act_register());
value.setData_day_register_create(accumulator.getData_day_register_create() + value.getData_day_register_create());
value.setData_active_day_dau(accumulator.getData_active_day_dau() + value.getData_active_day_dau());
return value;
}
@Override
public ActivationMetrics getResult(ActivationMetrics accumulator) {
return accumulator;
}
@Override
public ActivationMetrics merge(ActivationMetrics value, ActivationMetrics accumulator) {
value.setData_activation(accumulator.getData_activation() + value.getData_activation());
value.setData_register(accumulator.getData_register() + value.getData_register());
value.setData_device_register(accumulator.getData_device_register() + value.getData_device_register());
value.setData_create_role(accumulator.getData_create_role() + value.getData_create_role());
value.setData_day_act_register(accumulator.getData_day_act_register() + value.getData_day_act_register());
value.setData_day_register_create(accumulator.getData_day_register_create() + value.getData_day_register_create());
value.setData_active_day_dau(accumulator.getData_active_day_dau() + value.getData_active_day_dau());
return value;
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import com.google.gson.Gson;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
public class ActivationResultWindows implements WindowFunction<ActivationMetrics, ActivationMetrics, String, TimeWindow> {
@Override
public void apply(String s, TimeWindow window, Iterable<ActivationMetrics> input, Collector<ActivationMetrics> out) throws Exception {
BaseMetrics baseMetrics = BaseMetrics.setKey(s);
ActivationMetrics activationMetrics = copyMetrics(baseMetrics);
ActivationMetrics accumulator = input.iterator().next();
activationMetrics.setData_activation(accumulator.getData_activation());
activationMetrics.setData_register(accumulator.getData_register());
activationMetrics.setData_device_register(accumulator.getData_device_register());
activationMetrics.setData_create_role(accumulator.getData_create_role());
activationMetrics.setData_day_act_register(accumulator.getData_day_act_register());
activationMetrics.setData_day_register_create(accumulator.getData_day_register_create());
activationMetrics.setData_active_day_dau(accumulator.getData_active_day_dau());
out.collect(activationMetrics);
}
private ActivationMetrics copyMetrics(BaseMetrics metrics) {
Gson gson = new Gson();
return gson.fromJson(gson.toJson(metrics), ActivationMetrics.class);
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.entity.GameAccount;
import com.fshark.overseas.advert.entity.dao.GameAccountDao;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import com.fshark.overseas.advert.util.*;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.Locale;
import java.util.Optional;
/**
* 设备激活
*/
public class ActivitionProcess extends RichFlatMapFunction<AppsFlyerEvent, ActivationMetrics> {
private AppConfig appConfig;
private JdbiContext jdbiContext;
private GameAccountDao gameAccountDao;
public ActivitionProcess(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
gameAccountDao = jdbiContext.getJdbi().onDemand(GameAccountDao.class);
}
@Override
public void flatMap(AppsFlyerEvent value, Collector<ActivationMetrics> out) throws Exception {
ActivationMetrics activationMetrics = new ActivationMetrics();
copyBaseMetrics(value, activationMetrics);
activationMetrics.setUid(value.getUid());
Optional<GameAccount> account = gameAccountDao.findByPrimary(value, Constants.TYPE_ACTIVIYION);
String event_time = DateUtils.formatAsYMDHMS(value.getEvent_time());
if (!account.isPresent() || value.getIs_retargeting()) { //
gameAccountDao.insertActivition(value, event_time);
activationMetrics.setData_activation(1L);
activationMetrics.setData_date(Long.parseLong(DateUtils.formatAsYMD(event_time)));
activationMetrics.setData_hour(Integer.parseInt(DateUtils.formatAsHH(event_time)));
out.collect(activationMetrics);
}
}
private void copyBaseMetrics(AppsFlyerEvent value, BaseMetrics metrics) {
metrics.setTime_zone(value.getTime_zone());
metrics.setPlatform(value.getPlatform());
metrics.setMedia_source(value.getMedia_source());
metrics.setGame_id(value.getGame_id());
metrics.setCampaign_id(value.getCampaign_id());
metrics.setAd_set_id(value.getAd_set_id());
metrics.setAd_id(value.getAd_id());
metrics.setRegion(value.getRegion());
metrics.setChannel(value.getChannel());
metrics.setData_type(1);
if (value.getIs_retargeting()) { //再营销数据
metrics.setData_type(2);
}
if (value.getCampaign().toLowerCase(Locale.ROOT).startsWith("acp")) { //预注册数据
metrics.setData_type(3);
}
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.entity.GameAccount;
import com.fshark.overseas.advert.entity.dao.GameAccountDao;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.EventTypeEnum;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import com.fshark.overseas.advert.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.Date;
import java.util.Locale;
import java.util.Optional;
public class CreateRoleProcess extends RichFlatMapFunction<AppsFlyerEvent, ActivationMetrics> {
private AppConfig appConfig;
private JdbiContext jdbiContext;
private GameAccountDao gameAccountDao;
public CreateRoleProcess(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
gameAccountDao = jdbiContext.getJdbi().onDemand(GameAccountDao.class);
}
@Override
public void flatMap(AppsFlyerEvent value, Collector<ActivationMetrics> out) throws Exception {
ActivationMetrics activationMetrics = new ActivationMetrics();
copyBaseMetrics(value, activationMetrics);
activationMetrics.setUid(value.getUid());
Optional<GameAccount> account = gameAccountDao.findByPrimary(value, Constants.TYPE_ACTIVIYION);
String event_time = DateUtils.formatAsYMDHMS(value.getEvent_time());
if (!account.isPresent()) { // 设备未激活
activationMetrics.setData_date(Long.parseLong(DateUtils.formatAsYMD(event_time)));
activationMetrics.setData_hour(Integer.parseInt(DateUtils.formatAsHH(event_time)));
gameAccountDao.insertActivition(value, event_time);
activationMetrics.setData_activation(1L);
activationMetrics.setData_register(1L);
activationMetrics.setData_device_register(1L);
activationMetrics.setData_create_role(1L);
activationMetrics.setData_day_register_create(1L);
activationMetrics.setData_day_act_register(1L);
} else {
GameAccount gameAccount = account.get();
String activationTime = gameAccount.getEvent_time();
activationMetrics.setData_date(Long.parseLong(DateUtils.formatAsYMD(activationTime)));
activationMetrics.setData_hour(Integer.parseInt(DateUtils.formatAsHH(activationTime)));
Date activition = DateUtils.formatAsDate(activationTime);
activationMetrics.setData_create_role(1L);
Optional<GameAccount> accountRegister = gameAccountDao.findByPrimary(value, Constants.TYPE_REGISTER);
if (!accountRegister.isPresent()) {
activationMetrics.setData_register(1L);
activationMetrics.setData_device_register(1L);
activationMetrics.setData_day_register_create(1L);//当日注册并创角
if (DateUtils.daysBetween(activition, value.getEvent_time()) == 0) { //当日激活并且注册
activationMetrics.setData_day_act_register(1L);
}
} else {
if (DateUtils.daysBetween(DateUtils.formatAsDate(accountRegister.get().getEvent_time()), value.getEvent_time()) == 0) { //当日注册创角
activationMetrics.setData_day_register_create(1L);
}
}
}
gameAccountDao.insertRegister(value, event_time);
out.collect(activationMetrics);
}
private void copyBaseMetrics(AppsFlyerEvent value, BaseMetrics metrics) {
metrics.setTime_zone(value.getTime_zone());
metrics.setPlatform(value.getPlatform());
metrics.setMedia_source(value.getMedia_source());
metrics.setGame_id(value.getGame_id());
metrics.setCampaign_id(value.getCampaign_id());
metrics.setAd_set_id(value.getAd_set_id());
metrics.setAd_id(value.getAd_id());
metrics.setRegion(value.getRegion());
metrics.setChannel(value.getChannel());
metrics.setData_type(1);
if (value.getIs_retargeting()) { //再营销数据
metrics.setData_type(2);
}
if (value.getCampaign().toLowerCase(Locale.ROOT).startsWith("acp")) { //预注册数据
metrics.setData_type(3);
}
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.entity.dao.GameMappingDao;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.PlatformEnum;
import com.fshark.overseas.advert.modle.mapping.AdMapping;
import com.fshark.overseas.advert.modle.mapping.Game;
import com.fshark.overseas.advert.modle.mapping.Media;
import com.fshark.overseas.advert.modle.mapping.MediaCampaign;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.util.AppConfig;
import com.fshark.overseas.advert.util.Constants;
import com.fshark.overseas.advert.util.DatabaseUtils;
import com.fshark.overseas.advert.util.JdbiContext;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.common.state.MapState;
import org.apache.flink.api.common.state.MapStateDescriptor;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.Optional;
/**
* 更新游戏广告的映射
*/
public class GameAdMappingProcessor extends RichFlatMapFunction<AppsFlyerEvent, ActivationMetrics> {
private MapStateDescriptor<String, Game> stateDescriptor = new MapStateDescriptor("game_list_state", String.class, Game.class);
private MapStateDescriptor<String, Media> mediasourceStateDescriptor = new MapStateDescriptor("mediasource_list_state", String.class, Media.class);
private MapStateDescriptor<String, MediaCampaign> mediaCampaignStateDescriptor = new MapStateDescriptor("media_campaign_list_state", String.class, MediaCampaign.class);
private MapStateDescriptor<String, AdMapping> adMappingMapStateDescriptor = new MapStateDescriptor("ad_mapping_list_state", String.class, AdMapping.class);
private AppConfig appConfig;
private JdbiContext jdbiContext;
private GameMappingDao gameMappingDao;
private MapState<String, Game> gameState;
private MapState<String, Media> mediaSourceState;
private MapState<String, MediaCampaign> mediaCampaignState;
private MapState<String, AdMapping> adMappingMapState;
public GameAdMappingProcessor(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
gameMappingDao = jdbiContext.getJdbi().onDemand(GameMappingDao.class);
gameState = getRuntimeContext().getMapState(stateDescriptor);
mediaSourceState = getRuntimeContext().getMapState(mediasourceStateDescriptor);
mediaCampaignState = getRuntimeContext().getMapState(mediaCampaignStateDescriptor);
adMappingMapState = getRuntimeContext().getMapState(adMappingMapStateDescriptor);
}
@Override
public void flatMap(AppsFlyerEvent value, Collector<ActivationMetrics> out) throws Exception {
int platform_id = 1;
if (PlatformEnum.IOS.getName().equals(value.getPlatform())) {
platform_id = 2;
}
//更新game
Game game = gameState.get(value.getGame_id() + value.getPlatform());
if (game == null) {
boolean gameByPrimary = gameMappingDao.findGameByPrimary(value, platform_id);
if (!gameByPrimary) {
gameMappingDao.saveGame(value, platform_id);
}
gameState.put(value.getGame_id() + value.getPlatform(), new Game(platform_id, value.getGame_id()));
}
//mediaSource更新
String mediaSource = value.getMedia_source();
if (!Constants.DEFAULT_FIELD_VALUE.equals(mediaSource)) {
Media media = mediaSourceState.get(mediaSource);
if (media == null) {
Optional<Media> mediaByPrimary = gameMappingDao.findMediaByPrimary(value);
if (!mediaByPrimary.isPresent()) {
gameMappingDao.saveMediaSource(value);
} else {
mediaSourceState.put(mediaSource, mediaByPrimary.get());
}
}
}
//MediaCampaign更新
MediaCampaign mediaCampaign = mediaCampaignState.get(value.getMedia_source() + value.getCampaign());
if (null == mediaCampaign) {
Media media = mediaSourceState.get(mediaSource);
if (null != media) {
if (!gameMappingDao.existsMediaCampaign(value)) {
gameMappingDao.saveMediaCampaign(value, media);
mediaCampaignState.put(value.getMedia_source() + value.getCampaign(), new MediaCampaign(value.getMedia_source(), value.getCampaign()));
}
}
}
//adMapping 更新
AdMapping adMapping = adMappingMapState.get(value.getCampaign_id() + value.getAd_set_id() + value.getAd_id());
if (null == adMapping) {
Media media = mediaSourceState.get(mediaSource);
if (null != media) {
gameMappingDao.saveAdMapping(value, media);
adMappingMapState.put(value.getCampaign_id() + value.getAd_set_id() + value.getAd_id(),new AdMapping(value.getCampaign_id(),value.getAd_set_id(),value.getAd_id()));
}
}
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.processor;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.util.Collector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
public class ParseEventProcessor implements FlatMapFunction<String, AppsFlyerEvent> {
private Logger logger = LoggerFactory.getLogger(ParseEventProcessor.class);
@Override
public void flatMap(String value, Collector<AppsFlyerEvent> out) throws Exception {
try {
JSONObject jsonObject = JSON.parseObject(value);
String message = jsonObject.getString("message");
String parseLine = "";
try {
parseLine = parseLine(message);
} catch (Exception e) {
}
if (StringUtils.isBlank(parseLine)) {
return;
}
AppsFlyerEvent appsFlyerEvent = AppsFlyerEvent.parse(parseLine);
if (appsFlyerEvent != null) {
out.collect(appsFlyerEvent);
}
} catch (Exception e) {
e.printStackTrace();
logger.info(value);
}
}
private String parseLine(String log) {
if (!StringUtils.isEmpty(log)) {
if (log.contains("GET")) {
String[] tmp = log.split("GET /\\?");
if (tmp.length > 1) {
String params = tmp[1].split("HTTP/1.1")[0].trim();
if (!StringUtils.isEmpty(params)) {
if (params.indexOf("=") > 1) {
//参数的=没有进行编码,则可以先按照&符号来分隔取得每个参数
return splitDecode(params);
} else {
//没有=标识所有的特式字符都编码了,需要先解码再来获取参数
return decodeParse(params);
}
}
}
} else {
if (log.indexOf("=") > 1) {
//参数的=没有进行编码,则可以先按照&符号来分隔取得每个参数
return splitDecode(log);
} else {
//没有=标识所有的特式字符都编码了,需要先解码再来获取参数
return decodeParse(log);
}
}
}
return null;
}
/**
* 先按&将每个参数取出,然后对value进行decode取得值
*
* @param url
* @return
*/
private String splitDecode(String url) {
String[] params = url.split("&");
if (params.length > 0) {
JSONObject json = new JSONObject();
for (String p : params) {
String[] kv = p.split("=");
String v = "";
if (kv.length < 2 || StringUtils.isBlank(kv[1])) {
v = "";
} else {
try {
v = URLDecoder.decode(kv[1], "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
json.put(kv[0], v);
}
json.put("log_transport_type", "retransmission");
return json.toJSONString();
}
return null;
}
/**
* 先decode参数,然后根据字符解析出每个参数
*
* @param url
* @return
*/
private String decodeParse(String url) {
try {
String params = URLDecoder.decode(url, "UTF-8");
if (params.length() > 0) {
String s = params;
List<String> list = new ArrayList<>();
StringBuffer buffer = new StringBuffer();
StringBuffer tmp = new StringBuffer();
boolean f1 = false;
boolean f2 = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ("&".equals(String.valueOf(c))) {
if (f1) {
if (!f2) {
buffer.append(tmp.toString());
f2 = true;
} else {
list.add(buffer.toString());
buffer = tmp;
f2 = true;
}
tmp = new StringBuffer();
f1 = false;
} else {
if (f2) {
buffer.append(c).append(tmp.toString());
tmp = new StringBuffer();
} else {
//key中包含&这种数据有问题
}
}
} else if ("=".equals(String.valueOf(c))) {
if (f2) {
list.add(buffer.toString());
buffer = new StringBuffer();
f2 = false;
}
tmp.append(c);
f1 = true;
} else {
tmp.append(c);
}
if (i == (s.length() - 1)) {
if (buffer.length() > 0 && tmp.length() > 0) {
list.add(buffer.toString());
list.add(tmp.toString());
} else if (buffer.length() > 0 && tmp.length() == 0) {
buffer.append(c);
list.add(buffer.toString());
} else if (buffer.length() == 0 && tmp.length() > 0) {
if ("&".equals(String.valueOf(c))) {
tmp.append(c);
}
list.add(tmp.toString());
}
}
}
if (list.size() > 0) {
JSONObject json = new JSONObject();
for (String l : list) {
String[] kv = l.split("=");
String v = "";
if (kv.length < 2 || StringUtils.isBlank(kv[1])) {
v = "";
} else {
v = kv[1];
}
json.put(kv[0], v);
}
json.put("log_transport_type", "retransmission");
return json.toJSONString();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import com.fshark.overseas.advert.modle.metrics.RemainMetrics;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.util.Collector;
/**
* 留存指标
*/
public class RemainProcess extends RichFlatMapFunction<ActivationMetrics, RemainMetrics> {
@Override
public void flatMap(ActivationMetrics value, Collector<RemainMetrics> out) throws Exception {
if (value.getDateRemind() == 0L) {
return;
}
RemainMetrics remainMetrics = new RemainMetrics();
copyBaseMetrics(value, remainMetrics);
remainMetrics.setDays(value.getDateRemind());
remainMetrics.setUser_num(1L);
out.collect(remainMetrics);
}
private void copyBaseMetrics(ActivationMetrics value, BaseMetrics metrics) {
metrics.setData_date(value.getData_date());
metrics.setData_hour(value.getData_hour());
metrics.setTime_zone(value.getTime_zone());
metrics.setPlatform(value.getPlatform());
metrics.setMedia_source(value.getMedia_source());
metrics.setGame_id(value.getGame_id());
metrics.setCampaign_id(value.getCampaign_id());
metrics.setAd_set_id(value.getAd_set_id());
metrics.setAd_id(value.getAd_id());
metrics.setRegion(value.getRegion());
metrics.setData_type(value.getData_type());
metrics.setChannel(value.getChannel());
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.entity.GameAccount;
import com.fshark.overseas.advert.entity.dao.GameAccountDao;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.EventTypeEnum;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.modle.metrics.BaseMetrics;
import com.fshark.overseas.advert.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;
import java.util.Date;
import java.util.Locale;
import java.util.Optional;
public class RoleLoginProcess extends RichFlatMapFunction<AppsFlyerEvent, ActivationMetrics> {
private AppConfig appConfig;
private JdbiContext jdbiContext;
private GameAccountDao gameAccountDao;
public RoleLoginProcess(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
gameAccountDao = jdbiContext.getJdbi().onDemand(GameAccountDao.class);
}
@Override
public void flatMap(AppsFlyerEvent value, Collector<ActivationMetrics> out) throws Exception {
ActivationMetrics activationMetrics = new ActivationMetrics();
copyBaseMetrics(value, activationMetrics);
activationMetrics.setUid(value.getUid());
Optional<GameAccount> account = gameAccountDao.findByPrimary(value, Constants.TYPE_ACTIVIYION);
String event_time = DateUtils.formatAsYMDHMS(value.getEvent_time());
if (!account.isPresent()) { // 设备未激活
activationMetrics.setData_date(Long.parseLong(DateUtils.formatAsYMD(event_time)));
activationMetrics.setData_hour(Integer.parseInt(DateUtils.formatAsHH(event_time)));
gameAccountDao.insertActivition(value, event_time);
activationMetrics.setData_activation(1L);
activationMetrics.setData_register(1L);
activationMetrics.setData_device_register(1L);
activationMetrics.setData_day_act_register(1L);
gameAccountDao.insertRegister(value, event_time);
} else {
GameAccount gameAccount = account.get();
String activationTime = gameAccount.getEvent_time();
activationMetrics.setData_date(Long.parseLong(DateUtils.formatAsYMD(activationTime)));
activationMetrics.setData_hour(Integer.parseInt(DateUtils.formatAsHH(activationTime)));
Date activition = DateUtils.formatAsDate(activationTime);
Optional<GameAccount> accountRegister = gameAccountDao.findByPrimary(value, Constants.TYPE_REGISTER);
if (!accountRegister.isPresent()) { //设备未注册
gameAccountDao.insertRegister(value, event_time);
activationMetrics.setData_register(1L);
activationMetrics.setData_device_register(1L);
if (DateUtils.daysBetween(activition, value.getEvent_time()) == 0) { //当日激活并且注册
activationMetrics.setData_day_act_register(1L);
}
}
Optional<GameAccount> accountRoleLogin = gameAccountDao.findByPrimary(value, Constants.TYPE_ROLELOGIN);
if (accountRoleLogin.isPresent()) {
String last_login_time = accountRoleLogin.get().getEvent_time();
if (!StringUtils.isBlank(last_login_time)) {
Date date = DateUtils.formatAsDate(last_login_time);
if (DateUtils.daysBetween(date, value.getEvent_time()) != 0) { //排除当日登录用户
long daysBetween = DateUtils.daysBetween(activition, value.getEvent_time());
if (daysBetween > 0) {
activationMetrics.setDateRemind(daysBetween); //留存天数
ActivationMetrics dauMetric = new ActivationMetrics();
copyBaseMetrics(value, dauMetric);
dauMetric.setUid(value.getUid());
dauMetric.setData_date(Long.valueOf(DateUtils.formatAsYMD(value.getEvent_time())));
dauMetric.setData_hour(Integer.valueOf(DateUtils.formatAsHH(value.getEvent_time())));
dauMetric.setData_active_day_dau(1L);
out.collect(dauMetric);
}
}
}
}
}
gameAccountDao.insertRoleLogin(value);
out.collect(activationMetrics);
}
private void copyBaseMetrics(AppsFlyerEvent value, BaseMetrics metrics) {
metrics.setTime_zone(value.getTime_zone());
metrics.setPlatform(value.getPlatform());
metrics.setMedia_source(value.getMedia_source());
metrics.setGame_id(value.getGame_id());
metrics.setCampaign_id(value.getCampaign_id());
metrics.setAd_set_id(value.getAd_set_id());
metrics.setAd_id(value.getAd_id());
metrics.setRegion(value.getRegion());
metrics.setChannel(value.getChannel());
metrics.setData_type(1);
if (value.getIs_retargeting()) { //再营销数据
metrics.setData_type(2);
}
if (value.getCampaign().toLowerCase(Locale.ROOT).startsWith("acp")) { //预注册数据
metrics.setData_type(3);
}
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.processor;
import com.fshark.overseas.advert.entity.dao.MetricsDetailDao;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.util.AppConfig;
import com.fshark.overseas.advert.util.DatabaseUtils;
import com.fshark.overseas.advert.util.JdbiContext;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.windowing.ProcessAllWindowFunction;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
import org.checkerframework.checker.units.qual.C;
public class StoreMetricProcess extends ProcessAllWindowFunction<ActivationMetrics, Object, TimeWindow> {
private AppConfig appConfig;
private JdbiContext jdbiContext;
private MetricsDetailDao metricsDetailDao;
public StoreMetricProcess(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
metricsDetailDao = jdbiContext.getJdbi().onDemand(MetricsDetailDao.class);
}
@Override
public void process(Context context, Iterable<ActivationMetrics> elements, Collector<Object> out) throws Exception {
for (ActivationMetrics element : elements) {
if (element.getData_activation() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_activation");
}
if (element.getData_register() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_register");
}
if (element.getData_device_register() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_device_register");
}
if (element.getData_create_role() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_create_role");
}
if (element.getData_day_act_register() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_day_act_register");
}
if (element.getData_day_register_create() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_day_register_create");
}
if (element.getData_active_day_dau() > 0) {
metricsDetailDao.insertMetricDetail(element, "data_active_day_dau");
}
if (element.getDateRemind() > 0) {
String column = "retention_day" + element.getDateRemind();
metricsDetailDao.insertMetricDetail(element, column);
}
}
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.sink;
import com.fshark.overseas.advert.entity.dao.MetricsDao;
import com.fshark.overseas.advert.modle.metrics.ActivationMetrics;
import com.fshark.overseas.advert.util.AppConfig;
import com.fshark.overseas.advert.util.DatabaseUtils;
import com.fshark.overseas.advert.util.JdbiContext;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
public class ActicitionSink extends RichSinkFunction<ActivationMetrics> {
private AppConfig appConfig;
public ActicitionSink(AppConfig appConfig) {
this.appConfig = appConfig;
}
private JdbiContext jdbiContext;
private MetricsDao metricsDao;
@Override
public void invoke(ActivationMetrics value, Context context) throws Exception {
super.invoke(value, context);
if (value.getData_activation() + value.getData_register() + value.getData_device_register() + value.getData_create_role() + value.getData_day_act_register() + value.getData_day_register_create() + value.getData_active_day_dau() > 0) {
metricsDao.insertActivationMetrics(value);
}
if (value.getData_register() > 0){
metricsDao.insertRegisterNum(value);
}
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
metricsDao = jdbiContext.getJdbi().onDemand(MetricsDao.class);
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.sink;
import com.fshark.overseas.advert.entity.GameAccount;
import com.fshark.overseas.advert.entity.dao.GameAccountDao;
import com.fshark.overseas.advert.entity.dao.OrderDao;
import com.fshark.overseas.advert.modle.AppsFlyerEvent;
import com.fshark.overseas.advert.modle.AppsflyerPurchase;
import com.fshark.overseas.advert.modle.OrderData;
import com.fshark.overseas.advert.util.*;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.util.Optional;
public class PurchaseSink extends RichSinkFunction<AppsFlyerEvent> {
private AppConfig appConfig;
private JdbiContext jdbiContext;
private OrderDao orderDao;
private GameAccountDao gameAccountDao;
public PurchaseSink(AppConfig appConfig) {
this.appConfig = appConfig;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
orderDao = jdbiContext.getJdbi().onDemand(OrderDao.class);
gameAccountDao = jdbiContext.getJdbi().onDemand(GameAccountDao.class);
}
@Override
public void invoke(AppsFlyerEvent value, Context context) throws Exception {
super.invoke(value, context);
AppsflyerPurchase appsflyerPurchase = new Gson().fromJson(value.getEvent_value(), AppsflyerPurchase.class);
if (appsflyerPurchase == null || appsflyerPurchase.getBundle_id() == null) { //不是我们上报的格式
return;
}
if ("ios".equalsIgnoreCase(value.getPlatform())) {
String bundleId = appsflyerPurchase.getBundle_id();
value.setGame_id(bundleId == null ? value.getGame_id() : bundleId);
}
OrderData orderData = new OrderData(value);
String reg_time = null;
Optional<GameAccount> accountActivition = gameAccountDao.findByPrimary(value, Constants.TYPE_ACTIVIYION);
if (accountActivition.isPresent()) {
GameAccount gameAccount = accountActivition.get();
orderData.setActivation_time(gameAccount.getEvent_time());
reg_time = gameAccount.getEvent_time();
}
Optional<GameAccount> accountRegister = gameAccountDao.findByPrimary(value, Constants.TYPE_REGISTER);
if (accountRegister.isPresent()) {
GameAccount gameAccount = accountRegister.get();
orderData.setReg_time(gameAccount.getEvent_time());
reg_time = gameAccount.getEvent_time();
}
orderDao.insertOrder(orderData);
gameAccountDao.insertPauchase(value);
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.sink;
import com.fshark.overseas.advert.entity.dao.MetricsDao;
import com.fshark.overseas.advert.modle.metrics.RemainMetrics;
import com.fshark.overseas.advert.util.AppConfig;
import com.fshark.overseas.advert.util.DatabaseUtils;
import com.fshark.overseas.advert.util.JdbiContext;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
public class RemainSink extends RichSinkFunction<RemainMetrics> {
private AppConfig appConfig;
private MetricsDao metricsDao;
public RemainSink(AppConfig appConfig) {
this.appConfig = appConfig;
}
private JdbiContext jdbiContext;
@Override
public void invoke(RemainMetrics value, Context context) throws Exception {
super.invoke(value, context);
Long days = value.getDays();
//长线留存
if ((days >= 1 && days <= 30) || days == 35 || days == 40 || days == 45 || days == 50 || days == 55
|| days == 60 || days == 65 || days == 70 || days == 75 || days == 80 || days == 85 || days == 90 || days == 120 || days == 150 || days == 180) {
String column = "retention_day" + days;
// metricsDao.insertLongRetentionNum(value, column);
jdbiContext.getJdbi().withHandle(handle -> {
String sql = String.format("insert into appsflyer_retention" +
" (`data_date`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`currency`,%s)" +
" values ('%s','%s','%s','%s','%s','%s','%s','%s','KRW',%s) ",
column, value.getData_date(), value.getRegion(), value.getPlatform(), value.getGame_id(), value.getMedia_source(), value.getCampaign_id()
, value.getAd_set_id(), value.getAd_id(), value.getUser_num()
);
handle.createUpdate(sql).execute();
return null;
});
}
//短线留存
days = days + 1;
if (days == 2 || days == 3 || days == 7 || days == 15 || days == 30) {
String column = "data_active_" + days + "day";
jdbiContext.getJdbi().withHandle(handle -> {
String sql = String.format("insert into appsflyer_metrics" +
" (`data_date`,`data_hour`,`time_zone`,`region`, `platform`, `game_id`, `media_source`, `campaign_id` ,`ad_set_id`,`ad_id`,`channel`,`data_type`,`%s`)" +
" values ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%s,'%s') ",
column, value.getData_date(), value.getData_hour(), value.getTime_zone(), value.getRegion(), value.getPlatform(), value.getGame_id(), value.getMedia_source(), value.getCampaign_id()
, value.getAd_set_id(), value.getAd_id(), value.getChannel(), value.getData_type(), value.getUser_num()
);
handle.createUpdate(sql).execute();
return null;
});
}
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
jdbiContext = DatabaseUtils.getCHGenJdbiClient(appConfig.getDbHost(), appConfig.getDbUser(), appConfig.getDbPassword());
metricsDao = jdbiContext.getJdbi().onDemand(MetricsDao.class);
}
@Override
public void close() throws Exception {
super.close();
if (jdbiContext != null) {
jdbiContext.getDataSource().close();
}
}
}
package com.fshark.overseas.advert.util;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author libing
* @version 1.0
* @date 2019-08-02 16:04
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AppConfig implements Serializable {
private String stateSavePath;
private String dbHost;
private String dbUser;
private String dbPassword;
private String aggregateTopic;
private String aggregateBootstrapServers;
private String aggregateGroupId;
private String sourceKafkaBootstrapServers;
private String sourceKafkaGroupId;
private String sourceKafkaTopic;
}
package com.fshark.overseas.advert.util;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author libing
* @version 1.0
* @date 2019-08-02 16:59
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ClickFeedbackRecord {
private int gameId;
private String deviceId;
private String callbackURL;
public static String feedbackId(int gameId, String deviceId) {
return "fk-" + deviceId + "-" + gameId;
}
}
package com.fshark.overseas.advert.util;
import com.google.common.base.Strings;
import com.google.common.hash.Hashing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset;
/**
* @author jake.zhang [zhangxj@kingnet.com]
*/
public class Common {
private static final Logger logger = LoggerFactory.getLogger(Common.class);
private static final char[] hexDigits = "0123456789abcdef".toCharArray();
/**
* 线程 sleep 毫秒值
* @param millis
*/
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (Throwable e) {
logger.error("sleep error.", e);
}
}
/**
* 转换字节到字符串
* @param bytes
* @return
*/
public static String utf8(byte[] bytes) {
try {
return new String(bytes, "UTF8");
} catch (Throwable e) {
logger.error("byte[] to utf8 string error.", e);
}
return null;
}
public static byte[] utf8(String string) {
try {
return string.getBytes("UTF8");
} catch (Throwable e) {
logger.error("utf8 string to byte[] error.", e);
}
return null;
}
/**
* 默认使用 UTF-8 字符集
* @param str
* @return
*/
public static String md5(String str) {
return md5(str, Charset.forName("UTF-8"));
}
public static String bytesToHexString(byte[] source) {
StringBuilder sb = new StringBuilder(2 * source.length);
for (byte b : source) {
sb.append(hexDigits[(b >> 4) & 0xf]).append(hexDigits[b & 0xf]);
}
return sb.toString();
}
/**
* 使用 guava MD5 生成结果
* @param str
* @param charset
* @return
*/
public static String md5(String str, Charset charset) {
try {
return bytesToHexString(md5ToBytes(str, charset));
} catch (Throwable e) {
logger.error("md5 hashing " + str + " error.", e);
}
return null;
}
public static byte[] md5ToBytes(String str, Charset charset) {
return Hashing.md5().hashString(str, charset).asBytes();
}
public static long md5ToLong(String str) {
return md5ToLong(str, Charset.forName("UTF-8"));
}
public static long md5ToLong(String str, Charset charset) {
byte[] hashBytes = md5ToBytes(str, charset);
return bytesToLong(hashBytes, 0) + bytesToLong(hashBytes, 8);
}
public static long bytesToLong(byte[] bytes, int offset) {
return (bytes[offset] & 0xFFL) | ((bytes[offset + 1] & 0xFFL) << 8) | ((bytes[offset + 2] & 0xFFL) << 16)
| ((bytes[offset + 3] & 0xFFL) << 24) | ((bytes[offset + 4] & 0xFFL) << 32)
| ((bytes[offset + 5] & 0xFFL) << 40) | ((bytes[offset + 6] & 0xFFL) << 48)
| ((bytes[offset + 7] & 0xFFL) << 56);
}
/**
* 默认使用 utf-8 字符集
* @param str
* @return
*/
public static String fastHashing(String str) {
return fastHashing(str, Charset.forName("UTF-8"));
}
/**
* 使用快速 Hash 128 位结果
* @param str
* @param charset
* @return
*/
public static String fastHashing(String str, Charset charset) {
try {
return bytesToHexString(fastHashingToBytes(str, charset));
} catch (Throwable e) {
logger.error("murmur3_128() hashing " + str + " error.", e);
}
return null;
}
public static long fastHashingToLong(String str) {
return fastHashingToLong(str, Charset.forName("UTF-8"));
}
public static long fastHashingToLong(String str, Charset charset) {
byte[] hashBytes = fastHashingToBytes(str, charset);
return bytesToLong(hashBytes, 0) + bytesToLong(hashBytes, 8);
}
public static byte[] fastHashingToBytes(String str, Charset charset) {
return Hashing.murmur3_128().hashString(str, charset).asBytes();
}
/**
* 判斷字符串是否為空
* @param str 字符串
* @return true:空
*/
public static boolean isBlank(String str) {
return Strings.isNullOrEmpty(str);
}
}
package com.fshark.overseas.advert.util;
import java.util.regex.Pattern;
/**
* @author zhouml [zhouml@kingnet.com]
* @date 2019-03-01
*/
public class Constants {
private Constants() {}
public static final String YMD = "yyyyMMdd";
public static final String HH = "HH";
public static final String YMDHMS_MILLIS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final Long ONE_DAY_MILLIS = 1000 * 60 * 60 * 24L;
public static final Integer ZERO = 0;
public static final Integer ONE = 1;
public static final String DEFAULT_FIELD_VALUE = "-1";
public static final Integer MINUS_ONE = -1;
public static final String COLON = ":";
public static final String COMMA = ",";
public static final String YMDHMS = "yyyy-MM-dd HH:mm:ss";
/**
* 成功匹配或者多次匹配仍失败 产生的tuple streamid
*/
public static final String FINISHED = "finished";
/**
* topic field
*/
public static final String TOPIC = "topic";
/**
* 需要微信或者电话报警 streamid
*/
public static final String ALERT = "alert";
public static final String FAMILY = "info";
public static final Integer CACHE_REFRESH_INTERVAL = 60;
public static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
/**
* 重新匹配间隔 多久之内如果匹配则不再匹配 单位: ms
*/
public static final int REMATCH_INTERVAL = 10 * 1000;
/**
* 重新匹配时 每次从Redis队列中拉取的数据
*/
public static final int REMATCH_FETCH_SIZE = 1000;
/**
* 需要重新匹配的tuple streamid
*/
public static final String REMATCHED = "rematched";
public static final String TYPE_ACTIVIYION = "activition";
public static final String TYPE_REGISTER = "register";
public static final String TYPE_ROLELOGIN = "rolelogin";
public static final String TYPE_PAUCHASE = "pauchase";
}
package com.fshark.overseas.advert.util;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.sqlobject.SqlObjectPlugin;
import ru.yandex.clickhouse.ClickHouseConnection;
import ru.yandex.clickhouse.ClickHouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;
import java.sql.SQLException;
/**
* @author libing
* @version 1.0
* @date 2019-08-08 16:35
*/
public class DatabaseUtils {
public static JdbiContext getCHGenJdbiClient(String url, String username, String password) throws SQLException {
HikariConfig hc = new HikariConfig();
hc.setDriverClassName("ru.yandex.clickhouse.ClickHouseDriver");
hc.setJdbcUrl(url);
hc.setUsername(username);
hc.setPassword(password);
hc.setMaximumPoolSize(4);
HikariDataSource hikariDataSource = new HikariDataSource(hc);
Jdbi jdbi = Jdbi.create(hikariDataSource);
jdbi.installPlugin(new SqlObjectPlugin());
return new JdbiContext(hikariDataSource, jdbi);
}
}
package com.fshark.overseas.advert.util;
import java.time.LocalDateTime;
/**
* @author libing
* @version 1.0
* @date 2019-08-02 14:19
*/
public class DateTimeUtils {
public static int yearAndDay(LocalDateTime dateTime) {
return dateTime.getYear() * 10000 + dateTime.getMonthValue() * 100 + dateTime.getDayOfMonth();
}
}
package com.fshark.overseas.advert.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.Temporal;
import java.util.Calendar;
import java.util.Date;
/**
* @author zhouml
* @date 2018-11-29
*/
public class DateUtils {
static DateTimeFormatter YMDHMS_FORMATTER = DateTimeFormatter.ofPattern(Constants.YMDHMS);
static DateTimeFormatter YMDHMS_MILLIS_FORMATTER = DateTimeFormatter.ofPattern(Constants.YMDHMS_MILLIS);
static DateTimeFormatter HH_FORMATTER = DateTimeFormatter.ofPattern(Constants.HH);
static DateTimeFormatter YMD_FORMATTER = DateTimeFormatter.ofPattern(Constants.YMD);
public static String formatAsYMD(Date ts) {
if (ts == null){
return "-1";
}
LocalDateTime localDateTime = ts.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
return localDateTime.format(YMD_FORMATTER);
}
public static String formatAsYMDHMS(Date ts) {
LocalDateTime localDateTime = ts.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
return localDateTime.format(YMDHMS_FORMATTER);
}
/**
* 将 yyyy-MM-dd HH:mm:ss数据转换为yyyyMMdd
*
* @param ts
* @return
*/
public static String formatAsYMD(String ts) {
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_FORMATTER);
return parse.format(YMD_FORMATTER);
}
public static String formatAsHH(Date ts) {
LocalDateTime localDateTime = ts.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
return localDateTime.format(HH_FORMATTER);
}
public static String formatAsHH(String ts) {
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_FORMATTER);
return parse.format(HH_FORMATTER);
}
public static Date formatAsDate(String ts) {
if (ts.length() > 19) {
return formatHMSSAsDate(ts);
}
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_FORMATTER);
return Date.from(parse.atZone(ZoneId.systemDefault()).toInstant());
}
public static Date formatHMSSAsDate(String ts) {
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_MILLIS_FORMATTER);
return Date.from(parse.atZone(ZoneId.systemDefault()).toInstant());
}
public static String formatHMSSAsYMD(String ts) {
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_MILLIS_FORMATTER);
return parse.format(YMD_FORMATTER);
}
public static String formatHMSSAsHH(String ts) {
LocalDateTime parse = LocalDateTime.parse(ts, YMDHMS_MILLIS_FORMATTER);
return parse.format(HH_FORMATTER);
}
/**
* @return 相差天数
*/
public static long daysBetween(Date smdate, Date bdate) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
smdate = sdf.parse(sdf.format(smdate));
bdate = sdf.parse(sdf.format(bdate));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
return Integer.parseInt(String.valueOf(between_days));
}
public static long daysBetween(LocalDateTime smdate, Date bdate) throws ParseException {
Duration between = Duration.between(smdate, dateToLocalDateTime(bdate));
return between.toDays();
}
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
if (localDateTime == null) return null;
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static LocalDateTime dateToLocalDateTime(Date date) {
if (date == null) return null;
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
package com.fshark.overseas.advert.util;
import com.zaxxer.hikari.HikariDataSource;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.jdbi.v3.core.Jdbi;
/**
* @author libing
* @version 1.0
* @date 2020/8/27 4:25 下午
*/
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class JdbiContext {
private HikariDataSource dataSource;
private Jdbi jdbi;
}
package com.fshark.overseas.advert.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisException;
import java.util.function.Function;
/**
* @author libing
* @version 1.0
* @date 2019-08-02 16:06
*/
public class RedisClientUtils {
private static Logger LOG = LoggerFactory.getLogger(RedisClientUtils.class);
public static <R> R using(JedisPool jedisPool, int maxRetry, Function<Jedis, R> apply) {
do {
try (Jedis client = jedisPool.getResource()) {
return apply.apply(client);
} catch (JedisException e) {
LOG.error("retry " + maxRetry, e);
}
} while (--maxRetry >= 0);
return null;
}
public static JedisPoolConfig getGeneralRedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(2);
jedisPoolConfig.setMaxIdle(2);
jedisPoolConfig.setTestWhileIdle(true);
return jedisPoolConfig;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment