通过Spark SQL读写C-Store数据
云原生数据仓库 AnalyticDB MySQL 版集群支持通过Spark SQL在线或离线读写C-Store表(即表引擎是XUANWU的表)数据。本文主要介绍通过Spark SQL在线或离线读写C-Store表数据的具体方法。
前提条件
集群的产品系列为企业版、基础版或湖仓版。
说明湖仓版集群存储预留资源需大于0 ACU。
企业版集群预留资源需大于0 ACU。
基础版集群预留资源需大于0 ACU。
已在企业版、基础版或湖仓版集群中创建Job型资源组。
已创建企业版、基础版或湖仓版集群的数据库账号。
步骤一:进入数据开发
登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,然后单击目标集群ID。
在左侧导航栏,单击
。在SQLConsole窗口,选择Spark引擎和Job型资源组。
步骤二:创建库和C-Store表
您可以选择批处理或交互式执行任意一种方式执行以下SQL语句。详情请参见Spark SQL执行方式。
执行以下语句,创建数据库。
CREATE DATABASE spark_create_adb_db_test;
执行以下语句,创建C-Store表。Spark SQL建表语法详情请参见Spark SQL创建内表。
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', 'storagePolicy'='COLD' );
步骤三:读写C-Store表数据
您可以选择批处理或交互式执行任意一种方式执行以下SQL语句。详情请参见Spark SQL执行方式。
执行Spark SQL语句,只返回执行成功或者失败,不返回数据。您可以在Spark Jar开发页面应用列表页签中的日志查看表数据。详情请参见查看Spark应用信息。
离线读写数据(INSERT OVERWRITE)时,仅需选择Spark引擎和Job型资源组,无需配置其他参数;在线读写数据(INSERT INTO)时,需通过SET命令设置执行SQL语句的资源组,且资源组类型必须为Interactive型。
离线读写数据(INSERT OVERWRITE)
注意事项
离线读写数据需注意以下内容:
仅支持通过Spark SQL读取(SELECT)和写入(INSERT)C-Store分区表中的数据,不支持读写非分区表数据。分区表创建方法,详情请参见CREATE TABLE。
不支持通过Spark SQL更新(UPDATE)和删除(DELETE)C-Store表数据(包括分区表和非分区表)。
查询热数据时,需要先修改
ELASTIC_ENABLE_HOT_PARTITION_HAS_HDD_REPLICA
配置项,并手动BUILD。待BUILD完成后,再执行SQL查询语句,否则会导致SQL执行失败。使用XIHE引擎执行如下SQL,修改配置项。
SET adb_config ELASTIC_ENABLE_HOT_PARTITION_HAS_HDD_REPLICA=true;
手动BUILD。
对指定分区BUILD:
重要仅3.1.6.0及以上版本的集群支持指定分区BUILD。
请在云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本。
BUILD TABLE <table_name> force partitions='partition1,partition2';
全表BUILD:
重要该功能默认关闭,且强制全表BUILD时会对全表所有分区的数据重新构建索引,耗时较久。建议您使用指定分区BUILD功能。若需使用强制全表BUILD功能,请谨慎评估系统风险后提交工单开启该功能。
BUILD TABLE <table_name> force = true;
触发BUILD任务后,执行如下语句查看BUILD任务状态:
SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;
写入C-Store表数据。
AnalyticDB for 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表数据。
SELECT * FROM spark_create_adb_db_test.test_adb_tbl;
在线读写数据(INSERT INTO)
AnalyticDB for MySQL支持通过INSERT INTO语句在线写入数据到C-Store表。您可以通过JDBC方式或View方式读写数据。
Spark配置项
通过Spark SQL读写C-Store表时,支持配置如下配置项:
配置项 | 说明 | 默认值 |
spark.adb.write.batchSize | 单批次写入数据的条数。取值范围为大于0的正整数。 说明 仅在线写入数据时,支持配置该参数。 | 600 |
spark.adb.write.arrow.maxMemoryBufferSize | 写入最大内存缓冲大小。取值范围为大于0的正整数,单位为MB。 说明 仅离线写入数据时,支持配置该参数。 | 1024 |
spark.adb.write.arrow.maxRecordSizePerBatch | 单批次写入数据的最大记录条数。取值范围为大于0的正整数。 说明 仅离线写入数据时,支持配置该参数。 | 500 |