本文介绍如何使用DataX工具将表格存储中的数据导出至本地CSV文件,表格存储中的数据表或时序表均可作为源表进行导出操作。
背景信息
DataX是一个异构数据源离线同步工具,支持多种数据源(如 MySQL、Oracle、HDFS、Hive 、Tablestore等)之间的高效稳定同步。
准备工作
获取表格存储的服务地址、实例名称和源表信息。
- 重要
出于安全考虑,强烈建议您通过RAM用户使用表格存储功能。您可以创建RAM用户、授予该用户管理表格存储权限(
AliyunOTSFullAccess
)并为该RAM用户创建AccessKey。具体操作,请参见使用RAM用户访问密钥访问表格存储。
操作步骤
本文以云服务器ECS(操作系统:Alibaba Cloud Linux 3.2104 LTS 64位、Ubuntu 22.04 64位)为例介绍具体操作。
步骤一:安装依赖
安装Python(Python 2和Python 3均可)。
ECS的Alibaba Cloud Linux和Ubuntu系统已自带Python 3,其他系统请自行安装。
安装JDK(1.8及以上,推荐1.8)。
本文介绍在ECS的Alibaba Cloud Linux或Ubuntu系统中安装JDK 1.8的方法,其他系统请自行安装。
Alibaba Cloud Linux
yum -y install java-1.8.0-openjdk-devel.x86_64
Ubuntu
apt update && apt upgrade apt install openjdk-8-jdk
步骤二:下载DataX
下载DataX工具包。
wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz
解压工具包。
tar -zxvf datax.tar.gz
如需自行编译DataX,请参见DataX安装指引。
步骤三:编写配置文件
进入DataX的
bin
目录。cd datax/bin
创建配置文件。如果您使用的是
vim
,请自行替换命令。vi tablestore_to_csv.json
配置文件示例如下,请根据您的同步需求和实际情况,调整文件中的相关参数。
导出数据表
数据表源表
orders
的结构信息,请参见附录1:数据表。{ "job": { "setting": { "speed": { "channel": 1 }, "errorLimit": { "record": 0, "percentage": 0 } }, "content": [ { "reader": { "name": "otsreader", "parameter": { "endpoint": "https://<YOUR-INSTANCE>.<YOUR-REGION>.ots.aliyuncs.com", "accessId": "<YOUR-ACCESS-KEY-ID>", "accessKey": "<YOUR-ACCESS-KEY-SECRET>", "instanceName": "<YOUR-INSTANCE>", "table": "orders", "range": { "begin": [ { "type": "INF_MIN" } ], "end": [ { "type": "INF_MAX" } ] }, "column": [ { "name": "order_id" }, { "name": "user_id" }, { "name": "sku_id" }, { "name": "price" }, { "name": "num" }, { "name": "total_price" }, { "name": "order_status" }, { "name": "create_time" }, { "name": "modified_time" } ] } }, "writer": { "name": "txtfilewriter", "parameter": { "path": "/tmp/export/", "fileName": "output.csv", "writeMode": "truncate", "fileFormat": "csv" } } } ] } }
导出时序表
时序表源表
vehicles_timeseriesdata
的结构信息,请参见附录2:时序表。{ "job": { "setting": { "speed": { "channel": 1 } }, "content": [ { "reader": { "name": "otsreader", "parameter": { "endpoint": "https://<YOUR-INSTANCE>.<YOUR-REGION>.ots.aliyuncs.com", "accessId": "<YOUR-ACCESS-KEY-ID>", "accessKey": "<YOUR-ACCESS-KEY-SECRET>", "instanceName": "<YOUR-INSTANCE>", "table": "vehicles_timeseriesdata", "mode": "normal", "newVersion": "true", "isTimeseriesTable": "true", "measurementName": "measurement_1", "timeRange": { "begin": 0, "end": 1750000000000 }, "column": [ { "name": "_m_name" }, { "name": "_data_source" }, { "name": "_tags" }, { "name": "_time" }, { "name": "vin_id", "type": "STRING" }, { "name": "mfrs", "type": "STRING" }, { "name": "model", "type": "STRING" }, { "name": "speed", "type": "DOUBLE" }, { "name": "gps", "type": "STRING" }, { "name": "mileage", "type": "DOUBLE" }, { "name": "emission", "type": "DOUBLE" } ] } }, "writer": { "name": "txtfilewriter", "parameter": { "path": "/tmp/export/", "fileName": "output.csv", "writeMode": "truncate", "fileFormat": "csv" } } } ] } }
OTSReader需要替换的参数说明如下:
参数名称
说明
channel
数据同步任务的核心并行单元。
每个channel对应一个独立的数据读取与写入线程,通过调整channel数量可以控制任务的并发度,进而影响系统性能和资源消耗。
endpoint
表格存储实例的服务地址。
说明如果通过云服务器ECS访问 Tablestore,推荐使用VPC地址。不会产生外网下行流量费用,同时提供更高的网络性能和安全性。
accessId
阿里云账号或RAM用户的AccessKey ID。
accessKey
阿里云账号或RAM用户的AccessKey Secret。
instanceName
表格存储实例的名称。
tableName
表格存储的源表名称。
column
需要导出的列数组。
range
begin和end分别为数据读取的起始主键和结束主键,格式为JSON数组,读取范围为左闭右开的区间。
起始主键和结束主键需要是有效的主键或者是由
INF_MIN
和INF_MAX
类型组成的虚拟点,虚拟点的列数必须与主键相同。其中INF_MIN
表示无限小,任何类型的值都比它大;INF_MAX
表示无限大,任何类型的值都比它小。说明数据表作为源表时使用此参数。此参数为可选项,默认值表示从无限小开始读取。
measurementName
需要读取时间线的度量名称。如果未配置,则将读取全表数据。
说明时序表作为源表时使用此参数。
timeRange
begin和end分别为数据读取的起始时间戳和结束时间戳,格式为JSON数组,读取范围为左闭右开的区间。时间戳单位为毫秒。
说明时序表作为源表时使用此参数。此参数为可选项,默认值表示读取全部版本。
TxtFileWriter需要替换的参数说明如下:
参数名称
说明
path
导出文件在系统中的路径信息。
fileName
导出文件的名称,需包含文件扩展名。例如
output.csv
。writeMode
TxtFileWriter在写入数据前的处理模式,取值范围如下:
truncate:写入前清理指定目录下所有以fileName为前缀的文件。
append:写入前不进行任何处理,直接使用filename写入,并保证文件名不冲突。
nonConflict:如果目录下存在以 fileName 为前缀的文件,则报错并中止操作。
fileFormat
文件写出的格式,支持
csv
和text
两种类型。
步骤四:执行DataX任务
执行以下命令开始导出数据。
python3 datax.py tablestore_to_csv.json
任务结束后,将打印整体运行情况。
2025-03-19 17:21:05.146 [job-0] INFO StandAloneJobContainerCommunicator - Total 200000 records, 23086634 bytes | Speed 1.10MB/s, 10000 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.222s | All Task WaitReaderTime 18.392s | Percentage 100.00% 2025-03-19 17:21:05.147 [job-0] INFO JobContainer - 任务启动时刻 : 2025-03-19 17:20:43 任务结束时刻 : 2025-03-19 17:21:05 任务总计耗时 : 21s 任务平均流量 : 1.10MB/s 记录写入速度 : 10000rec/s 读出记录总数 : 200000 读写失败总数 : 0
验证导出结果。
任务执行完成后,请检查指定的路径(如
/tmp/export/
),确认导出的CSV文件是否符合预期。output.csv__d737aec2_c9e3_4489_a5d7_361f44c998ce
说明导出的CSV文件名称将附加随机后缀,以便区分多线程生成的文件。需要您手动移除此后缀,以获得标准的CSV文件。
附录-源表样例
附录1:数据表
数据表样例的名称为orders
,表结构信息请参见下表。
字段名称 | 类型 | 描述 |
order_id(主键) | String | 订单ID。 |
user_id | String | 用户ID。 |
sku_id | String | 商品ID。 |
price | Double | 商品购买单价。 |
num | Integer | 商品购买数量。 |
total_price | Double | 订单总价。 |
order_status | String | 订单状态。 |
create_time | String | 订单创建时间。 |
modified_time | String | 最后修改时间。 |
附录2:时序表
时序表样例的名称为vehicles_timeseriesdata
,表结构信息请参见下表。
字段名称 | 类型 | 描述 |
_m_name | String | 度量名称,表示时间线数据所度量的物理量或者监控指标的名称。 |
_data_source | String | 数据源,表示产生时间线的数据源标识,可以为空。 |
_tags | String | 时间线的标签信息。 |
_time | Integer | 数据上报时间。 |
vin_id | String | 车辆识别代码,即车架号,用于唯一标识车辆。 |
mfrs | String | 生产厂商。 |
model | String | 车辆型号。 |
speed | Double | 当前速度。 |
gps | String | 车辆GPS坐标,格式为 |
mileage | Double | 当前里程数。 |
emission | Double | 排放值。 |