StarRocks menyediakan connector Apache Flink, selanjutnya disebut Flink Connector, untuk mengimpor data dari Flink ke tabel StarRocks. Flink Connector StarRocks menawarkan kinerja dan stabilitas yang lebih baik dibandingkan flink-connector-jdbc bawaan Flink, sehingga ideal untuk skenario impor data skala besar.
Informasi latar belakang
Flink Connector StarRocks menyimpan cache mini-batch data di memori dan menggunakan fitur Stream Load milik StarRocks untuk impor batch. Connector ini mendukung DataStream API, Table API & SQL, serta Python API, yang secara signifikan meningkatkan efisiensi impor data.
Prasyarat
-
Anda telah membuat kluster dengan layanan Flink diaktifkan.
Topik ini menggunakan kluster DataFlow dengan layanan Flink yang dibuat di EMR pada ECS, selanjutnya disebut kluster Flink, sebagai contoh. Untuk informasi lebih lanjut, lihat Buat kluster.
-
Anda telah membuat instans EMR Serverless StarRocks. Untuk informasi lebih lanjut, lihat Buat instans.
Batasan
-
Pastikan mesin yang menjalankan Flink dapat mengakses http_port (default
8030) dan query_port (default9030) node FE, serta be_http_port (default8040) node BE di instans StarRocks. -
Untuk menggunakan Flink Connector mengimpor data ke StarRocks, Anda memerlukan izin SELECT dan INSERT pada tabel target.
-
Flink Connector memiliki persyaratan kompatibilitas berikut terhadap versi Java, Scala, dan Flink.
Connector
Flink
StarRocks
Java
Scala
1.2.9
1.15–1.18
2.1 dan seterusnya
8
2.11, 2.12
1.2.8
1.13–1.17
2.1 dan seterusnya
8
2.11, 2.12
1.2.7
1.11–1.15
2.1 dan seterusnya
8
2.11, 2.12
Konfigurasi
Bagian ini menjelaskan pengaturan parameter StarRocks dan pemetaan tipe data. Untuk informasi lebih lanjut, lihat Impor data secara berkelanjutan dari Apache Flink® | StarRocks.
Deskripsi parameter
|
Parameter |
Wajib |
Nilai default |
Deskripsi |
|
|
Ya |
NONE |
Menentukan connector sebagai StarRocks. Atur parameter ini ke |
|
|
Ya |
NONE |
Digunakan untuk menjalankan kueri di StarRocks. Contoh: jdbc:mysql://fe-c-9b354c83e891**-internal.starrocks.aliyuncs.com:9030. Di sini, Catatan Untuk informasi tentang cara memperoleh alamat jaringan pribadi node FE di instans EMR Serverless StarRocks Anda, lihat Lihat daftar dan detail instans. |
|
|
Ya |
NONE |
Menentukan alamat jaringan pribadi dan port HTTP node FE dalam format Contoh: fe-c-9b354c83e891****-internal.starrocks.aliyuncs.com:8030. |
|
|
Ya |
NONE |
Nama database StarRocks. |
|
|
Ya |
NONE |
Nama tabel StarRocks. |
|
|
Ya |
NONE |
Username untuk instans StarRocks Anda. Misalnya, username default adalah admin. Untuk menggunakan Flink Connector mengimpor data ke StarRocks, Anda memerlukan izin SELECT dan INSERT pada tabel target. Jika akun pengguna Anda tidak memiliki izin tersebut, berikan izin terlebih dahulu. Untuk informasi lebih lanjut, lihat Kelola pengguna dan otorisasi data. |
|
|
Ya |
NONE |
Password untuk instans StarRocks Anda. |
|
|
Tidak |
at-least-once |
Menentukan tingkat jaminan semantik sink untuk memastikan keandalan dan konsistensi saat menulis data ke sistem target. Nilai yang valid:
|
|
|
Tidak |
AUTO |
Menentukan antarmuka impor data. Parameter ini didukung mulai dari Flink Connector 1.2.4.
|
|
|
Tidak |
NONE |
Menentukan awalan untuk label Stream Load. Jika Anda menggunakan Flink Connector 1.2.8 atau lebih baru dan memerlukan semantik exactly-once, kami merekomendasikan mengonfigurasi awalan label. |
|
|
Tidak |
94371840 (90 MB) |
Ukuran maksimum data yang dibuffer di memori sebelum diimpor ke StarRocks melalui Stream Load dalam satu batch. Nilai yang lebih besar meningkatkan kinerja impor tetapi dapat meningkatkan latensi impor. Rentang valid: [64 MB, 10 GB]. Catatan
|
|
sink.buffer-flush.max-rows |
Tidak |
500000 |
Jumlah maksimum baris yang dibuffer di memori sebelum diimpor ke StarRocks melalui Stream Load dalam satu batch. Rentang valid: [64000, 5000000]. Catatan
Parameter ini hanya berlaku ketika |
|
sink.buffer-flush.interval-ms |
Tidak |
300000 |
Interval (dalam milidetik) untuk mengirim data, yang mengontrol latensi penulisan data ke StarRocks. Rentang valid: [1000, 3600000]. Catatan
Parameter ini hanya berlaku ketika |
|
sink.max-retries |
Tidak |
3 |
Jumlah maksimum percobaan ulang setelah kegagalan Stream Load. Jika batas ini terlampaui, tugas impor data gagal. Rentang valid: [0, 10]. Catatan
Parameter ini hanya berlaku ketika |
|
sink.connect.timeout-ms |
Tidak |
30000 |
Timeout (dalam milidetik) untuk membuat koneksi HTTP dengan node FE. Rentang valid: [100, 60000]. Pada versi Flink Connector sebelum 1.2.9, nilai default-nya adalah |
|
sink.socket.timeout-ms |
Tidak |
-1 |
Didukung mulai dari Flink Connector 1.2.10. Timeout (dalam milidetik) untuk klien HTTP menunggu data. Nilai default |
|
sink.wait-for-continue.timeout-ms |
Tidak |
10000 |
Didukung mulai dari Flink Connector 1.2.7. Timeout (dalam milidetik) untuk menunggu respons HTTP 100-continue dari FE. Rentang valid: [3000, 60000]. |
|
sink.ignore.update-before |
Tidak |
TRUE |
Didukung mulai dari Flink Connector 1.2.8. Saat mengimpor data ke tabel primary key, menentukan apakah akan mengabaikan catatan UPDATE_BEFORE dari Flink. Jika diatur ke false, catatan tersebut diperlakukan sebagai operasi DELETE di tabel primary key. |
|
sink.parallelism |
Tidak |
NONE |
Paralelisme untuk penulisan. Hanya berlaku untuk Flink SQL. Jika tidak diatur, planner Flink menentukan paralelisme. Dalam skenario multi-paralelisme, pastikan data ditulis dalam urutan yang benar. |
|
sink.properties.* |
Tidak |
NONE |
Parameter untuk Stream Load yang mengontrol perilaku impor. |
|
sink.properties.format |
Tidak |
csv |
Format data untuk impor Stream Load. Flink Connector mengonversi data di memori ke format yang ditentukan sebelum mengimpornya ke StarRocks melalui Stream Load. Nilai yang valid: CSV atau JSON. |
|
sink.properties.column_separator |
Tidak |
\t |
Pemisah kolom untuk data CSV. |
|
sink.properties.row_delimiter |
Tidak |
\n |
Pemisah baris untuk data CSV. |
|
sink.properties.max_filter_ratio |
Tidak |
0 |
Rasio toleransi kesalahan maksimum untuk tugas impor. Ini adalah proporsi maksimum baris data yang dapat difilter karena kualitas data buruk. Rentang valid: 0–1. |
|
sink.properties.partial_update |
Tidak |
false |
Menentukan apakah akan mengaktifkan pembaruan parsial. Nilai yang valid: |
|
sink.properties.partial_update_mode |
Tidak |
row |
Menentukan mode pembaruan parsial. Nilai yang valid:
|
|
sink.properties.strict_mode |
Tidak |
false |
Menentukan apakah akan mengaktifkan mode ketat untuk Stream Load. Mode ketat memengaruhi perilaku impor saat baris tidak valid (seperti yang memiliki nilai kolom tidak konsisten) ditemukan. Nilai yang valid: |
|
sink.properties.compression |
Tidak |
NONE |
Didukung mulai dari Flink Connector 1.2.10. Menentukan algoritma kompresi untuk Stream Load. Saat ini, hanya format JSON yang mendukung kompresi. Nilai yang valid: Catatan
Hanya StarRocks 3.2.7 dan lebih baru yang mendukung kompresi JSON. |
Pemetaan tipe data
|
Tipe data Flink |
Tipe data StarRocks |
|
BOOLEAN |
BOOLEAN |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INTEGER |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
FLOAT |
|
DOUBLE |
DOUBLE |
|
DECIMAL |
DECIMAL |
|
BINARY |
INT |
|
CHAR |
STRING |
|
VARCHAR |
STRING |
|
STRING |
STRING |
|
DATE |
DATE |
|
TIMESTAMP_WITHOUT_TIME_ZONE(N) |
DATETIME |
|
TIMESTAMP_WITH_LOCAL_TIME_ZONE(N) |
DATETIME |
|
ARRAY<T> |
ARRAY<T> |
|
MAP<KT,VT> |
JSON STRING |
|
ROW<arg T...> |
JSON STRING |
Persiapan
Peroleh file JAR Flink Connector dan unggah ke kluster Flink Anda
-
Anda dapat memperoleh file JAR Flink Connector dengan salah satu metode berikut.
Metode 1: Unduh langsung
Anda dapat mengunduh berbagai versi file JAR Flink Connector dari Maven Central Repository.
Metode 2: Dependensi Maven
Tambahkan Flink Connector sebagai dependensi ke file
pom.xmlproyek Maven Anda dalam format berikut.-
Untuk Flink Connector yang kompatibel dengan Flink 1.15 dan seterusnya:
<dependency> <groupId>com.starrocks</groupId> <artifactId>flink-connector-starrocks</artifactId> <version>${connector_version}_flink-${flink_version}</version> </dependency> -
Untuk Flink Connector yang kompatibel dengan versi Flink sebelum 1.15:
<dependency> <groupId>com.starrocks</groupId> <artifactId>flink-connector-starrocks</artifactId> <version>${connector_version}_flink-${flink_version}_${scala_version}</version> </dependency>
Metode 3: Kompilasi manual
-
Unduh kode sumber Flink Connector.
-
Jalankan perintah berikut untuk mengompilasi kode sumber Flink Connector menjadi file JAR.
sh build.sh <flink_version>Sebagai contoh, jika versi Flink Anda adalah 1.17, jalankan perintah berikut.
sh build.sh 1.17 -
Setelah kompilasi, Anda dapat menemukan file JAR yang dihasilkan di direktori
target/.Sebagai contoh, nama file biasanya dalam format
flink-connector-starrocks-1.2.7_flink-1.17-SNAPSHOT.jar.CatatanVersi Flink Connector yang belum dirilis mencakup akhiran
SNAPSHOT.
Nama file JAR Flink Connector mengikuti format berikut:
-
Untuk Flink 1.15 dan seterusnya:
flink-connector-starrocks-${connector_version}_flink-${flink_version}.jar. Sebagai contoh, jika Anda menggunakan Flink 1.17 dan Flink Connector 1.2.8, nama file-nya adalahflink-connector-starrocks-1.2.8_flink-1.17.jar. -
Untuk versi Flink sebelum 1.15:
flink-connector-starrocks-${connector_version}_flink-${flink_version}_${scala_version}.jar. Sebagai contoh, jika Anda menggunakan Flink 1.14, Scala 2.12, dan Flink Connector 1.2.7, nama file-nya adalahflink-connector-starrocks-1.2.7_flink-1.14_2.12.jar.CatatanGanti placeholder berikut sesuai kebutuhan:
-
flink_version: Nomor versi Flink Anda. -
scala_version: Nomor versi Scala Anda. -
connector_version: Nomor versi Flink Connector Anda.
-
-
-
Unggah file JAR Flink Connector yang telah Anda peroleh ke direktori
flink-{flink_version}/libkluster Flink Anda.Sebagai contoh, jika Anda menggunakan kluster EMR versi EMR-5.19.0, letakkan file JAR di direktori
/opt/apps/FLINK/flink-current/lib.
Jalankan kluster Flink
-
Masuk ke node master kluster Flink Anda. Untuk informasi lebih lanjut, lihat Masuk ke kluster.
-
Jalankan perintah berikut untuk menjalankan kluster Flink.
/opt/apps/FLINK/flink-current/bin/start-cluster.sh
Contoh
Tulis data menggunakan Flink SQL
-
Buat database bernama
testdi StarRocks, lalu buat tabel primary key bernamascore_boarddi database tersebut.CREATE DATABASE test; CREATE TABLE test.score_board( id int(11) NOT NULL COMMENT "", name varchar(65533) NULL DEFAULT "" COMMENT "", score int(11) NOT NULL DEFAULT "0" COMMENT "" ) ENGINE=OLAP PRIMARY KEY(id) DISTRIBUTED BY HASH(id); -
Masuk ke node master kluster Flink Anda. Untuk informasi lebih lanjut, lihat Masuk ke kluster.
-
Jalankan perintah berikut untuk menjalankan Flink SQL.
/opt/apps/FLINK/flink-current/bin/sql-client.sh -
Jalankan perintah berikut untuk membuat tabel bernama
score_boarddan memasukkan data ke dalamnya.CREATE TABLE `score_board` ( `id` INT, `name` STRING, `score` INT, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>', ); INSERT INTO `score_board` VALUES (1, 'starrocks', 100), (2, 'flink', 100);Jika Anda mengimpor data ke tabel primary key StarRocks, Anda harus secara eksplisit menentukan primary key dalam DDL tabel Flink. Untuk jenis tabel StarRocks lainnya, seperti tabel Duplicate Key, menentukan primary key bersifat opsional.
Tulis data menggunakan Flink DataStream
Tulis pekerjaan Flink DataStream berdasarkan jenis catatan input.
-
Tulis data string berformat CSV
Jika catatan input Anda berupa string berformat CSV, lihat kode lengkap pekerjaan Flink DataStream di LoadCsvRecords.
/** * Generate CSV-format records. Each record has three values separated by "\t". * These values will be loaded to the columns `id`, `name`, and `score` in the StarRocks table. */ String[] records = new String[]{ "1\tstarrocks-csv\t100", "2\tflink-csv\t100" }; DataStream<String> source = env.fromElements(records); /** * Configure the Flink connector with the required properties. * You also need to add properties "sink.properties.format" and "sink.properties.column_separator" * to tell the Flink connector the input records are CSV-format, and the column separator is "\t". * You can also use other column separators in the CSV-format records, * but remember to modify the "sink.properties.column_separator" correspondingly. */ StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "root") .withProperty("password", "") .withProperty("sink.properties.format", "csv") .withProperty("sink.properties.column_separator", "\t") .build(); // Create the sink with the options. SinkFunction<String> starRockSink = StarRocksSink.sink(options); source.addSink(starRockSink); -
Tulis data string berformat JSON
Jika catatan input Anda berupa string berformat JSON, lihat kode lengkap pekerjaan Flink DataStream di LoadJsonRecords.
/** * Generate JSON-format records. * Each record has three key-value pairs corresponding to the columns id, name, and score in the StarRocks table. */ String[] records = new String[]{ "{\"id\":1, \"name\":\"starrocks-json\", \"score\":100}", "{\"id\":2, \"name\":\"flink-json\", \"score\":100}", }; DataStream<String> source = env.fromElements(records); /** * Configure the Flink connector with the required properties. * You also need to add properties "sink.properties.format" and "sink.properties.strip_outer_array" * to tell the Flink connector the input records are JSON-format and to strip the outermost array structure. */ StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "root") .withProperty("password", "") .withProperty("sink.properties.format", "json") .withProperty("sink.properties.strip_outer_array", "true") .build(); // Create the sink with the options. SinkFunction<String> starRockSink = StarRocksSink.sink(options); source.addSink(starRockSink); -
Tulis data objek Java kustom
Jika catatan input Anda berupa objek Java kustom, lihat kode lengkap pekerjaan Flink DataStream di LoadCustomJavaRecords.
-
Dalam contoh ini, kelas POJO sederhana
RowDatadidefinisikan untuk merepresentasikan setiap catatan.public static class RowData { public int id; public String name; public int score; public RowData() {} public RowData(int id, String name, int score) { this.id = id; this.name = name; this.score = score; } } -
Kode utamanya adalah sebagai berikut.
// Generate records which use RowData as the container. RowData[] records = new RowData[]{ new RowData(1, "starrocks-rowdata", 100), new RowData(2, "flink-rowdata", 100), }; DataStream<RowData> source = env.fromElements(records); // Configure the Flink connector with the required properties. StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "root") .withProperty("password", "") .build(); /** * The Flink connector will use a Java object array (Object[]) to represent a row to be loaded into the StarRocks table, * and each element is the value for a column. * You need to define the schema of the Object[] which matches that of the StarRocks table. */ TableSchema schema = TableSchema.builder() .field("id", DataTypes.INT().notNull()) .field("name", DataTypes.STRING()) .field("score", DataTypes.INT()) // When the StarRocks table is a Primary Key table, you must specify notNull(), for example, DataTypes.INT().notNull(), for the primary key `id`. .primaryKey("id") .build(); // Transform the RowData to the Object[] according to the schema. RowDataTransformer transformer = new RowDataTransformer(); // Create the sink with the schema, options, and transformer. SinkFunction<RowData> starRockSink = StarRocksSink.sink(schema, options, transformer); source.addSink(starRockSink);RowDataTransformerdidefinisikan sebagai berikut.private static class RowDataTransformer implements StarRocksSinkRowBuilder<RowData> { /** * Set each element of the object array according to the input RowData. * The schema of the array matches that of the StarRocks table. */ @Override public void accept(Object[] internalRow, RowData rowData) { internalRow[0] = rowData.id; internalRow[1] = rowData.name; internalRow[2] = rowData.score; // When the StarRocks table is a Primary Key table, you need to set the last element to indicate whether the data loading is an UPSERT or DELETE operation. internalRow[internalRow.length - 1] = StarRocksSinkOP.UPSERT.ordinal(); } }
-
Sinkronkan data menggunakan Flink CDC 3.0
Framework Flink CDC 3.0 menyederhanakan pembuatan pipeline ELT streaming dari sumber data CDC, seperti MySQL atau Kafka, ke StarRocks. Dengan pipeline ini, Anda dapat:
-
Membuat database dan tabel secara otomatis
-
Menyinkronkan data penuh dan inkremental
-
Menyinkronkan perubahan skema
Mulai dari StarRocks Flink Connector v1.2.9, connector ini diintegrasikan ke dalam framework Flink CDC 3.0 dan diganti namanya menjadi StarRocks Pipeline Connector. Connector ini mendukung semua fitur di atas. Kami merekomendasikan Anda menggunakannya dengan StarRocks v3.2.1 atau lebih baru untuk memanfaatkan fitur `fast_schema_evolution`, yang lebih mempercepat penambahan dan penghapusan kolom serta mengurangi konsumsi sumber daya.
Praktik terbaik
Impor ke tabel primary key
-
Buat database bernama
testdi StarRocks, lalu buat tabel primary key bernamascore_board.CREATE DATABASE `test`; CREATE TABLE `test`.`score_board` ( `id` int(11) NOT NULL COMMENT "", `name` varchar(65533) NULL DEFAULT "" COMMENT "", `score` int(11) NOT NULL DEFAULT "0" COMMENT "" ) ENGINE=OLAP PRIMARY KEY(`id`) COMMENT "OLAP" DISTRIBUTED BY HASH(`id`); -
Masukkan data ke tabel StarRocks.
INSERT INTO `test`.`score_board` VALUES (1, 'starrocks', 100), (2, 'flink', 100); -
Jalankan perintah berikut untuk menjalankan klien Flink SQL.
/opt/apps/FLINK/flink-current/bin/sql-client.sh -
Perbarui data.
Pembaruan parsial
Pembaruan parsial memungkinkan Anda memperbarui hanya kolom tertentu, seperti
name, tanpa memengaruhi kolom lain, sepertiscore.-
Buat tabel
score_boarddi klien Flink SQL dan aktifkan pembaruan parsial.CREATE TABLE `score_board` ( `id` INT, `name` STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>', 'sink.properties.partial_update' = 'true', -- only for Flink connector version <= 1.2.7 'sink.properties.columns' = 'id,name,__op' );-
sink.properties.partial_update: Mengaktifkan pembaruan parsial. -
sink.properties.columns: Menentukan kolom yang akan diperbarui. Jika versi Flink Connector adalah 1.2.7 atau lebih lama, Anda juga harus mengatur opsisink.properties.columnskeid,name,__opuntuk memberi tahu Flink connector kolom mana yang akan diperbarui. Perhatikan bahwa Anda harus menambahkan bidang__opdi akhir. Bidang__opmenunjukkan apakah impor merupakan operasi UPSERT atau DELETE, dan nilainya diatur secara otomatis oleh Flink connector.
-
-
Masukkan data yang diperbarui.
Masukkan dua baris yang memiliki primary key sama dengan data yang ada tetapi dengan nilai yang dimodifikasi di kolom
name.INSERT INTO score_board VALUES (1, 'starrocks-update'), (2, 'flink-update'); -
Kueri tabel StarRocks di SQL Editor.
SELECT * FROM `test`.`score_board`;Anda akan melihat bahwa hanya nilai di kolom
nameyang berubah, sedangkan kolomscoretetap tidak berubah.Kueri mengembalikan dua catatan:
id=1, name=starrocks-update, score=100danid=2, name=flink-update, score=100.
Pembaruan bersyarat
Contoh ini menunjukkan cara melakukan pembaruan bersyarat berdasarkan nilai kolom
score. Baris diperbarui hanya jika nilaiscorepada data masuk lebih besar dari atau sama dengan nilai saat ini di tabel StarRocks.-
Buat tabel
score_boarddi klien Flink SQL sebagai berikut.CREATE TABLE `score_board` ( `id` INT, `name` STRING, `score` INT, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>', 'sink.properties.merge_condition' = 'score', 'sink.version' = 'V1' );-
sink.properties.merge_condition: Diatur kescore. Ini menentukan bahwa Flink Connector menggunakan kolomscoresebagai kondisi pembaruan selama penulisan data. -
sink.version: Diatur keV1. Ini menentukan bahwa Flink Connector menggunakan antarmuka Stream Load untuk mengimpor data.
-
-
Masukkan dua baris data ke tabel di klien Flink SQL.
Baris-baris tersebut memiliki primary key yang sama dengan baris yang ada di tabel StarRocks. Baris pertama memiliki nilai
scorelebih kecil, dan baris kedua memiliki nilaiscorelebih besar.INSERT INTO `score_board` VALUES (1, 'starrocks-update', 99), (2, 'flink-update', 101); -
Kueri tabel StarRocks di SQL Editor.
SELECT * FROM `test`.`score_board`;Anda akan melihat bahwa hanya baris kedua yang berubah, sedangkan baris pertama tetap tidak berubah.
Kueri mengembalikan dua catatan: baris pertama
id=1, name=starrocks, score=100(tidak berubah) dan baris keduaid=2, name=flink-update, score=101(diperbarui).
-
Impor ke kolom Bitmap
Tipe data Bitmap umumnya digunakan untuk mempercepat skenario penghitungan jumlah unik yang tepat, seperti menghitung pengunjung unik (UV). Contoh berikut menunjukkan cara mengimpor data ke kolom Bitmap tabel StarRocks menggunakan Flink SQL dan mengkueri jumlah UV di StarRocks.
-
Buat tabel agregat StarRocks di SQL Editor.
Buat tabel agregat bernama
page_uvdi databasetestdengan spesifikasi berikut:-
Kolom
visit_usersdidefinisikan sebagai tipe BITMAP dan dikonfigurasi dengan fungsi agregat `BITMAP_UNION`. -
page_iddanvisit_dateberfungsi sebagai kunci agregat (AGGREGATE KEY) untuk pengelompokan dan deduplikasi.
CREATE TABLE `test`.`page_uv` ( `page_id` INT NOT NULL COMMENT 'page ID', `visit_date` datetime NOT NULL COMMENT 'access time', `visit_users` BITMAP BITMAP_UNION NOT NULL COMMENT 'user ID' ) ENGINE=OLAP AGGREGATE KEY(`page_id`, `visit_date`) DISTRIBUTED BY HASH(`page_id`); -
-
Buat tabel di klien Flink SQL.
Karena Flink tidak mendukung tipe Bitmap, Anda harus menerapkan pemetaan kolom dan konversi tipe sebagai berikut:
-
Di tabel Flink, definisikan kolom
visit_user_idsebagai BIGINT untuk merepresentasikan kolomvisit_usersdi tabel StarRocks. -
Gunakan konfigurasi
sink.properties.columnsuntuk mengonversi data di kolomvisit_user_idke tipe Bitmap menggunakan fungsi `to_bitmap`.
CREATE TABLE `page_uv` ( `page_id` INT, `visit_date` TIMESTAMP, `visit_user_id` BIGINT ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'page_uv', 'username' = 'admin', 'password' = '<password>', 'sink.properties.columns' = 'page_id,visit_date,visit_user_id,visit_users=to_bitmap(visit_user_id)' ); -
-
Masukkan data di klien Flink SQL.
Masukkan beberapa baris ke tabel
page_uvuntuk mensimulasikan pengguna berbeda mengakses halaman pada waktu berbeda.visit_user_idbertipe BIGINT. Flink secara otomatis mengonversinya ke tipe Bitmap.INSERT INTO `page_uv` VALUES (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 13), (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 23), (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 33), (1, CAST('2020-06-23 02:30:30' AS TIMESTAMP), 13), (2, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 23); -
Kueri jumlah UV di SQL Editor.
Gunakan kemampuan agregasi StarRocks untuk menghitung jumlah pengunjung unik (UV) per halaman dengan
COUNT(DISTINCT visit_users).SELECT page_id, COUNT(DISTINCT visit_users) FROM page_uv GROUP BY page_id;Untuk
page_id2,count(DISTINCT visit_users)adalah 1. Untukpage_id1,count(DISTINCT visit_users)adalah 3.
Impor ke kolom HLL
HyperLogLog (HLL) adalah tipe data yang digunakan untuk penghitungan jumlah unik perkiraan dan cocok untuk menghitung pengunjung unik (UV) dalam skenario data skala besar. Contoh berikut menunjukkan cara mengimpor data ke kolom HLL tabel StarRocks menggunakan Flink SQL dan mengkueri jumlah UV di StarRocks.
-
Buat tabel agregat StarRocks di SQL Editor.
Buat tabel agregat bernama
hll_uvdi databasetestdengan spesifikasi berikut:-
Kolom
visit_usersdidefinisikan sebagai tipe HLL dan dikonfigurasi dengan fungsi agregat `HLL_UNION`. -
page_iddanvisit_dateberfungsi sebagai kunci agregat (AGGREGATE KEY) untuk pengelompokan dan deduplikasi.
CREATE TABLE `test`.`hll_uv` ( `page_id` INT NOT NULL COMMENT 'page ID', `visit_date` DATETIME NOT NULL COMMENT 'access time', `visit_users` HLL HLL_UNION NOT NULL COMMENT 'user ID' ) ENGINE=OLAP AGGREGATE KEY(`page_id`, `visit_date`) DISTRIBUTED BY HASH(`page_id`); -
-
Buat tabel di klien Flink SQL.
Karena Flink tidak mendukung tipe HLL, Anda harus menerapkan pemetaan kolom dan konversi tipe sebagai berikut:
-
Di tabel Flink, definisikan kolom
visit_user_idsebagai BIGINT untuk merepresentasikan kolomvisit_usersdi tabel StarRocks. -
Gunakan konfigurasi
sink.properties.columnsuntuk memetakan kolom dan mengonversi datavisit_user_idbertipe BIGINT ke tipe HLL menggunakan fungsi `hll_hash`.
CREATE TABLE `hll_uv` ( `page_id` INT, `visit_date` TIMESTAMP, `visit_user_id` BIGINT ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'hll_uv', 'username' = 'admin', 'password' = '<password>', 'sink.properties.columns' = 'page_id,visit_date,visit_user_id,visit_users=hll_hash(visit_user_id)' ); -
-
Masukkan data di klien Flink SQL.
Masukkan beberapa baris ke tabel
hll_uvuntuk mensimulasikan pengguna berbeda mengakses halaman pada waktu berbeda.visit_user_idbertipe BIGINT. Flink secara otomatis mengonversinya ke tipe HLL.INSERT INTO `hll_uv` VALUES (3, CAST('2023-07-24 12:00:00' AS TIMESTAMP), 78), (4, CAST('2023-07-24 13:20:10' AS TIMESTAMP), 2), (3, CAST('2023-07-24 12:30:00' AS TIMESTAMP), 674); -
Kueri jumlah UV di SQL Editor.
Gunakan kemampuan agregasi StarRocks untuk menghitung jumlah pengunjung unik (UV) per halaman dengan
COUNT(DISTINCT visit_users).SELECT `page_id`, COUNT(DISTINCT `visit_users`) FROM `hll_uv` GROUP BY `page_id`;Hasilnya adalah sebagai berikut.
page_id count(DISTINCT visit_users) 0 4 1 1 3 2