本文介绍如何使用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 | 排放值。 |