本文介绍如何使用DataX工具将表格存储中的数据导出至本地CSV文件,表格存储中的数据表或时序表均可作为源表进行导出操作。
背景信息
DataX是一个异构数据源离线同步工具,支持MySQL、Oracle、HDFS、Hive、Tablestore等多种数据源之间的高效稳定同步。
使用DataX导出数据前,请注意以下事项:
导出文件命名:DataX导出的CSV文件名会附加随机后缀(例如
output.csv__d737aec2_c9e3_4489_a5d7_361f44c998ce),导出完成后需手动移除后缀以获得标准CSV文件名。网络访问费用:如果在云服务器ECS上运行DataX,建议使用VPC地址访问表格存储实例,可避免产生外网下行流量费用,同时获得更高的网络性能和安全性。
准备工作
获取表格存储的服务地址、实例名称和源表信息。
-
重要
出于安全考虑,强烈建议通过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_64Ubuntu
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对应一个独立的读写线程,调整此值可控制任务并发度,进而影响系统性能和资源消耗。
endpoint
两者
表格存储实例的服务地址。通过云服务器ECS访问Tablestore时,建议使用VPC地址,可避免外网下行流量费用,并提供更高的网络性能和安全性。
accessId
两者
阿里云账号或RAM用户的AccessKey ID。
accessKey
两者
阿里云账号或RAM用户的AccessKey Secret。
instanceName
两者
表格存储实例的名称。
tableName
两者
表格存储的源表名称。
column
两者
需要导出的列数组。
range
数据表
数据读取的主键范围,begin和end分别为起始主键和结束主键,格式为JSON数组,读取范围为左闭右开区间。起始主键和结束主键需要是有效的主键或由
INF_MIN(无限小)和INF_MAX(无限大)类型组成的虚拟点,虚拟点的列数必须与主键相同。此参数为可选项,默认从无限小开始读取。measurementName
时序表
需要读取时间线的度量名称。未配置时读取全表数据。
timeRange
时序表
数据读取的时间戳范围,begin和end分别为起始时间戳和结束时间戳,单位为毫秒,读取范围为左闭右开区间。此参数为可选项,默认读取全部版本。
-
TxtFileWriter需要替换的参数说明如下:
参数名称
说明
path
导出文件在系统中的保存路径。
fileName
导出文件的名称,需包含文件扩展名,例如
output.csv。writeMode
写入数据前的文件处理模式,取值如下:
-
truncate:写入前删除目标目录下所有以fileName为前缀的文件。 -
append:直接写入文件,不做预处理,并保证文件名不冲突。 -
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预览文件内容,验证数据是否正确:
head -5 output.csv__d737aec2_c9e3_4489_a5d7_361f44c998ce输出示例如下:
order_id,user_id,sku_id,price,num,total_price,order_status,create_time,modified_time ORD-001,USR-100,SKU-200,29.99,2,59.98,completed,2025-01-01 08:00:00,2025-01-02 10:00:00 ORD-002,USR-101,SKU-201,49.99,1,49.99,pending,2025-01-02 09:00:00,2025-01-02 09:00:00移除随机后缀以获得标准CSV文件名:
mv output.csv__d737aec2_c9e3_4489_a5d7_361f44c998ce output.csv说明导出的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 |
排放值。 |