ORC

ORC 是一种自描述列式文件格式,专门为 Hadoop 生态设计,可用于高效存储与提取数据,因此适合大批量流数据读取场景。

DolphinDB 的 ORC 插件支持将 ORC 文件导入和导出 DolphinDB,并且在导入导出过程中自动进行数据类型转换。

注意

  1. ORC 插件仅支持 Linux 系统
  2. 插件市场及插件仓库上线后,插件编译不再是必须的,因此下文中相关小节以“(可选)”标注,使用插件市场或插件仓库获取并安装插件的用户可以跳过这些小节。按照传统方式编译并安装插件的用户,可前往orc插件获取更多信息及下载资源。

在插件市场安装插件

版本要求

  • DolphinDB Server: 2.00.10及更高版本

安装步骤

  1. 在DolphinDB 客户端中使用 listRemotePlugins 命令查看插件仓库中的插件信息。

    login("admin", "123456")
    listRemotePlugins(, "http://plugins.dolphindb.cn/plugins/")
  2. 使用 installPlugin 命令完成插件安装。

    installPlugin("orc")

    返回:<path_to_Orc_plugin>/PluginOrc.txt

  3. 使用 loadPlugin 命令加载插件(即上一步返回的.txt文件)。

    loadPlugin("<path_to_Orc_plugin>/PluginOrc.txt")

    注意:若使用 Windows 插件,加载时必须指定绝对路径,且路径中使用"\\"或"/"代替"\"。

接口说明

orc::extractORCSchema

语法

orc::extractORCSchema(fileName)

参数

  • fileName: ORC 文件名,类型为 string。

详情

解析指定 ORC 文件中数据集的结构。

返回值

返回一个表,包括 name 和 type 两列,分别表示列名和数据类型。

例子

orc::extractORCSchema("userdata1.orc")

orc::loadORC

语法

orc::loadORC(fileName,[schema],[column],[rowStart],[rowNum])

参数

  • fileName: ORC 文件名,类型为字符串标量。
  • schema: 包含列名和列的数据类型的表。若要改变列的数据类型,需要在 schema 表中修改数据类型。
  • column: 整型向量,表示读取的列的索引。若不指定,读取所有列。
  • rowStart: 从哪一行开始读取 ORC 文件。若不指定,默认从文件起始位置读取。
  • rowNum: 读取行的数量。若不指定,默认读到文件的结尾。

详情

将 ORC 文件数据加载为 DolphinDB 数据表的内存表。支持的 ORC 数据类型,以及数据转化规则可见数据类型章节。

返回值

返回一个将 ORC 文件导入后的内存表。

例子

orc::loadORC("userdata1.orc")

注意:DolphinDB 中不支持下划线开头的列名。若 ORC 文件中含有以下划线开头的列名,系统自动增加字母 "Z" 作为前缀。

orc::loadORCEx

语法

orc::loadORCEx(dbHandle,tableName,[partitionColumns],fileName,[schema],[column],[rowStart],[rowNum],[transform])

参数

  • dbHandle 与 ``tableName`: 数据库句柄和表名。
  • partitionColumns: 字符串标量或向量,表示分区列。当分区数据库不是 SEQ 分区时,我们需要指定分区列。在组合分区中,partitionColumns 是字符串向量。
  • fileName: ORC 文件名,类型为字符串标量。
  • schema: 包含列名和列的数据类型的表。若要改变列的数据类型,需要在 schema 表中修改数据类型。
  • column: 整型向量,表示读取的列的索引。若不指定,读取所有列。
  • rowStart: 从哪一行开始读取 ORC 文件。若不指定,默认从文件起始位置读取。
  • rowNum: 读取行的数量。若不指定,默认读到文件的结尾。
  • tranform: 一元函数,并且该函数接受的参数必须是一个表。如果指定了 transform 参数,需要先创建分区表,再加载数据,程序会对数据文件中的数据执行 transform 参数指定的函数,再将得到的结果保存到数据库中。

详情

将 ORC 文件数据转换为 DolphinDB 数据库的分布式表,然后将表的元数据加载到内存中。支持的 ORC 数据类型, 以及数据转化规则可见数据类型章节。

返回值

返回一个包含分布式表元数据的表对象。

例子

db = database("dfs://db1", RANGE, 0 500 1000)
orc::loadORCEx(db,`tb,`id,"userdata1.orc")
  • 指定 transform 将将数值类型表示的日期和时间 (比如: 20200101) 转化为指定类型(比如: 日期类型)

    dbPath="dfs://db2"
    db=database(dbPath,VALUE,2020.01.01..2020.01.30)
    dataFilePath="userdata1.orc"
    schemaTB=orc::extractORCSchema(dataFilePath)
    update schemaTB set type="DATE" where name="date"
    tb=table(1:0,schemaTB.name,schemaTB.type)
    tb1=db.createPartitionedTable(tb,`tb1,`date);
    def i2d(mutable t){
        return t.replaceColumn!(`date,datetimeParse(t.date),"yyyy.MM.dd"))
    }
    t = orc::loadORCEx(db,`tb1,`date,dataFilePath,datasetName,,,,i2d)

orc::orcDS

语法

orc::orcDS(fileName,chunkSize,[schema],[skipRows])

参数

  • fileName: ORC 文件名,类型为字符串标量。
  • chunkSize: 每个数据源包含的行数。
  • schema: 包含列名和列的数据类型的表。若要改变由系统自动决定的列的数据类型,需要在 schema 表中修改数据类型,并且把它作为 loadORC 函数的一个参数。
  • skipRows: 从文件头开始忽略的行数,默认值为 0。

详情

根据输入的文件名创建数据源列表, 数量由文件中的行数与 chunkSize 决定。

返回值

返回由数据源组成的向量。

例子

>ds = orc::orcDS("userdata1.orc", 1000)
>size ds;
1
>ds[0];
DataSource<loadORC("userdata1.orc", , 0, 1000) >

orc::saveORC

语法

orc::saveORC(table, fileName)

参数

  • table: 要保存的内存表对象。
  • fileName: 保存的 ORC 文件名,类型为字符串标量。

详情

将 DolphinDB 内存表保存为 ORC 格式文件。 请注意,若向一个已存在的 ORC 文件中保存表数据,这会覆盖 ORC 文件原有内容。

返回值

无。

例子

orc::saveORC(tb, "example.orc")

支持的数据类型

ORC 的数据类型转换为 DolphinDB 数据类型对照表:

Type in ORCType in DolphinDB
booleanBOOL
tinyintCHAR
smallintSHORT
intINT
bigintLONG
floatFLOAT
doubleDOUBLE
stringSTRING
charSTRING
varcharSTRING
binarynot support
timestampNANOTIMESTAMP
dateDATE
structnot support
listnot support
mapnot support
unionnot support

版本历史

故障修复

  • 修复了读取时间类型空值数据时输出结果不正确的问题。(2.00.10

功能优化

  • 优化了时间类型和字符串类型数据导入为数值类型的处理方法。(2.00.10

附录:通过传统方式安装(可选)

预编译安装

可以导入预编译好的 ORC 插件。

  1. 添加插件所在路径到 LIB 搜索路径 LD_LIBRARY_PATH。

    export LD_LIBRARY_PATH=path_to_orc_plugin/:$LD_LIBRARY_PATH
  2. 启动 DolphinDB server 并导入插件。

    loadPlugin("path_to_orc_plugin/PluginOrc.txt")

编译安装

使用以下方法编译 ORC 插件,编译成功后通过以上方法导入。

在Linux-x86下安装

  1. 安装 cmake。

    sudo apt-get install cmake
  2. 安装 cyrus-sasl。

    下载源码:https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.27/cyrus-sasl-2.1.27.tar.gz

    tar -xf cyrus-sasl-2.1.27.tar.gz
    cd cyrus-sasl-2.1.27
    ./configure CFLAGS=-fPIC CXXFLAGS=-fPIC LDFLAGS=-static
    cp ./lib/.libs/libsasl2.a path_to_orc_plugin/lib/linux
  3. 安装 openssl。

    wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz
    tar -xzf openssl-1.0.2u.tar.gz
    cd openssl-1.0.2u
    ./config shared --prefix=/tmp/ssl -fPIC
    make
    make install
    
    cp /tmp/ssl/lib/libcrypto.a path_to_orc_plugin/lib/linux
  4. 安装 ORC 开发包。

    下载源码:https://www.apache.org/dyn/closer.cgi/orc/orc-1.6.7/orc-1.6.7.tar.gz

    tar -xf orc-1.6.7.tar.gz
    cd orc-1.6.7
    mkdir build
    cd build
    cmake .. -DBUILD_JAVA=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make package
    tar -xf ORC-1.6.7-Linux.tar.gz
    cp ORC-1.6.7-Linux/lib/* path_to_orc_plugin/lib/linux
  5. 重新编译 libprotobuf.a。

    cd orc-1.6.7/build/protobuf_ep-prefix/src/
    tar -xf v3.5.1.tar.gz
    cd protobuf-3.5.1
    ./autogen.sh
    cd cmake
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libprotobuf.a path_to_orc_plugin/lib/linux

    注意:执行 ./autogen.sh 后出现的 "./autogen.sh: line 50: autoreconf: command not found" 消息并不影响接下来的步骤。

  6. 重新编译 libsnappy.a。

    cd orc-1.6.7/build/snappy_ep-prefix/src/
    tar -xf 1.1.7.tar.gz
    cd snappy-1.17
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libsnappy.a path_to_orc_plugin/lib/linux
  7. 重新编译 libz.a。

    cd orc-1.6.7/build/zlib_ep-prefix/src
    tar -xf zlib-1.2.11.tar.gz
    cd zlib-1.2.11
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libz.a path_to_orc_plugin/lib/linux
  8. 设置 libDolphinDB.so 库位置。

    export LIBDOLPHINDB=path_to_libdolphindb/
  9. 编译整个项目。

    mkdir build
    cd build
    cmake path_to_orc_plugin/
    make

在Linux-arm下安装

先在arm机器上编译ssl, orc, protobuffer, snappy, zlib依赖库,并把编译出来的静态库拷贝到lib_arm目录。

  1. 编译openssl。

    wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
    tar -xzf openssl-1.0.1u.tar.gz
    cd openssl-1.0.1u
    ./config shared --prefix=/tmp/ssl -fPIC
    make
    make install
    
  2. 编译orc开发包。

    下载源码:https://www.apache.org/dyn/closer.cgi/orc/orc-1.6.7/orc-1.6.7.tar.gz

    tar -xf orc-1.6.7.tar.gz
    cd orc-1.6.7
    mkdir build
    cd build
    CMAKE_PREFIX_PATH=/tmp/ssl cmake .. -DBUILD_JAVA=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON//指定里前面安装openssl1.0.1u的路径。
    make package
    tar -xf ORC-1.6.7-Linux.tar.gz
    cp ORC-1.6.7-Linux/lib/* path_to_orc_plugin/lib_arm/
  3. 重新编译libprotobuf.a。

    cd orc-1.6.7/build/protobuf_ep-prefix/src/
    tar -xf v3.5.1.tar.gz
    cd protobuf-3.5.1
    ./autogen.sh
    cd cmake
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libprotobuf.a path_to_orc_plugin/lib_arm/
  4. 重新编译libsnappy.a。

    cd orc-1.6.7/build/snappy_ep-prefix/src/
    tar -xf 1.1.7.tar.gz
    cd snappy-1.1.7
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libsnappy.a path_to_orc_plugin/lib_arm/
  5. 重新编译libz.a。

    cd orc-1.6.7/build/zlib_ep-prefix/srcap
    tar -xf zlib-1.2.11.tar.gz
    cd zlib-1.2.11
    mkdir build
    cd build
    cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
    make
    cp libz.a path_to_orc_plugin/lib_arm/

    使用交叉编译器在x86-64的机器上编译,将lib_arm文件夹从arm机器上复制过来。

  6. 编译整个项目。

    mkdir build
    cd build
    cp ../lib_arm/* .
    CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ cmake .. -DBUILD_ARM=1
    make