通过Spark SQL读写C-Store表数据
AnalyticDB MySQL湖仓版(3.0)支持通过Spark SQL读写C-Store表数据,本文主要介绍如何通过Spark SQL读写C-Store表数据。
前提条件
已创建湖仓版(3.0)集群且存储预留资源需大于0 ACU。详情请参见创建湖仓版集群。
已创建Job型资源组。详情请参见新建资源组。
已创建数据库普通账号,并将RAM用户(子账号)绑定到AnalyticDB MySQL的数据库普通账号上。具体操作,请参见创建和授权普通账号和绑定或解绑RAM用户与数据库账号。
注意事项
不支持通过Spark SQL更新和删除C-Store表数据。
写入或查询热数据时,需先修改相关配置项再执行SQL语句,否则会导致SQL执行失败。配置项如下:
SET adb_config CSTORE_HOT_TABLE_ALLOW_SINGLE_REPLICA_BUILD=true; SET adb_config ELASTIC_ENABLE_HOT_PARTITION_HAS_HDD_REPLICA=true; SET adb_config ELASTIC_PRODUCT_ENABLE_MIXED_STORAGE_POLICY=true;
重要修改配置项后需手动触发BUILD任务,详情请参见BUILD。
步骤一:进入数据开发
- 登录云原生数据仓库AnalyticDB MySQL控制台。
- 在页面左上角,选择集群所在地域。
- 在左侧导航栏,单击集群列表。
- 在湖仓版(3.0)页签下,单击目标集群ID。
- 在左侧导航栏,单击 。
- 在SQLConsole窗口,选择Job型资源组和Spark引擎。
步骤二:创建库和C-Store表
您可以选择批处理或交互式执行任意一种方式执行以下SQL语句。详情请参见Spark SQL执行方式。
执行以下语句,创建数据库。
CREATE DATABASE spark_create_adb_db_test;
执行以下语句,创建C-Store表。Spark SQL建表语法详情请参见Spark SQL创建C-Store表。
CREATE TABLE spark_create_adb_db_test.test_adb_tbl ( id int, name string COMMENT 'test_name', age int ) using adb TBLPROPERTIES('primaryKey'='id,age', 'distributeType'='HASH', 'distributeColumns'='id', 'partitionType'='value', 'partitionColumn'='age', 'partitionCount'='120' );
步骤三:写入C-Store表数据
您可以选择批处理或交互式执行任意一种方式执行以下SQL语句。详情请参见Spark SQL执行方式。
AnalyticDB MySQL仅支持通过INSERT OVERWRITE语句向C-Store表中写入数据。您可以选择以下任意一种方式向C-Store表写入数据:
方式一:INSERT OVERWRITE静态分区写入
INSERT OVERWRITE spark_create_adb_db_test.test_adb_tbl partition(age=10) values(1, 'bom');
方式二:INSERT OVERWRITE动态分区写入
INSERT OVERWRITE spark_create_adb_db_test.test_adb_tbl partition (age) values (1, 'bom', 10);
步骤四:查询C-Store表数据
您可以选择批处理或交互式执行任意一种方式执行以下SQL语句。详情请参见Spark SQL执行方式。
执行Spark SQL语句,只返回执行成功或者失败,不返回数据。您可以在Spark Jar开发页面应用列表页签中的日志查看表数据。详情请参见查看Spark应用信息。
执行以下语句,查询C-Store表数据。
SELECT * FROM spark_create_adb_db_test.test_adb_tbl;
Spark配置项
通过Spark SQL读写C-Store表时,支持配置如下配置项:
配置项 | 说明 | 默认值 |
spark.adb.write.batchSize | 单批次写入数据的条数。取值范围为大于0的正整数。 | 600 |
spark.adb.write.arrow.maxMemoryBufferSize | 写入最大内存缓冲大小。取值范围为大于0的正整数,单位为MB。 | 1024 MB |
spark.adb.write.arrow.maxRecordSizePerBatch | 单批次写入数据的最大记录条数。取值范围为大于0的正整数。 | 500 |
spark.adb.createSnapshot | INSERT OVERWRITE语句写入数据后是否创建快照。取值:
| false |
spark.adb.readDataVersion | 读取数据的版本。取值为:
| LATEST_BUILD |