通过DataX下载到本地CSV文件

本文介绍如何使用DataX工具将表格存储中的数据导出至本地CSV文件,表格存储中的数据表或时序表均可作为源表进行导出操作。

背景信息

DataX是一个异构数据源离线同步工具,支持多种数据源(如 MySQL、Oracle、HDFS、Hive 、Tablestore等)之间的高效稳定同步。

准备工作

操作步骤

说明

本文以云服务器ECS(操作系统:Alibaba Cloud Linux 3.2104 LTS 64位、Ubuntu 22.04 64位)为例介绍具体操作。

步骤一:安装依赖

  1. 安装Python(Python 2Python 3均可)。

    ECSAlibaba Cloud LinuxUbuntu系统已自带Python 3,其他系统请自行安装。

  2. 安装JDK(1.8及以上,推荐1.8)。

    本文介绍在ECSAlibaba Cloud LinuxUbuntu系统中安装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

  1. 下载DataX工具包。

    wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz
  2. 解压工具包。

    tar -zxvf datax.tar.gz

如需自行编译DataX,请参见DataX安装指引

步骤三:编写配置文件

  1. 进入DataXbin目录。

    cd datax/bin
  2. 创建配置文件。如果您使用的是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

      beginend分别为数据读取的起始主键和结束主键,格式为JSON数组,读取范围为左闭右开的区间。

      起始主键和结束主键需要是有效的主键或者是由INF_MININF_MAX类型组成的虚拟点,虚拟点的列数必须与主键相同。其中INF_MIN表示无限小,任何类型的值都比它大;INF_MAX表示无限大,任何类型的值都比它小。

      说明

      数据表作为源表时使用此参数。此参数为可选项,默认值表示从无限小开始读取。

      measurementName

      需要读取时间线的度量名称。如果未配置,则将读取全表数据。

      说明

      时序表作为源表时使用此参数。

      timeRange

      beginend分别为数据读取的起始时间戳和结束时间戳,格式为JSON数组,读取范围为左闭右开的区间。时间戳单位为毫秒。

      说明

      时序表作为源表时使用此参数。此参数为可选项,默认值表示读取全部版本。

    • TxtFileWriter需要替换的参数说明如下:

      参数名称

      说明

      path

      导出文件在系统中的路径信息。

      fileName

      导出文件的名称,需包含文件扩展名。例如output.csv

      writeMode

      TxtFileWriter在写入数据前的处理模式,取值范围如下:

      • truncate:写入前清理指定目录下所有以fileName为前缀的文件。

      • append:写入前不进行任何处理,直接使用filename写入,并保证文件名不冲突。

      • nonConflict:如果目录下存在以 fileName 为前缀的文件,则报错并中止操作。

      fileFormat

      文件写出的格式,支持csvtext两种类型。

步骤四:执行DataX任务

  1. 执行以下命令开始导出数据。

    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
  2. 验证导出结果。

    任务执行完成后,请检查指定的路径(如/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

排放值。