Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

选择合适的方法来添加行

你可以使用下面的SQL语句来添加行到Trafodion表中:

  • INSERT
  • UPSERT
  • UPSERT USING LOAD
  • LOAD

有关这些语句的格式,请参考Trafodion 有关这些语句的格式,请参考Trafodion SQL Reference Manual (pdf, 3.98 MB)。下面这张表格说明了这些语句间的区别,目的是为了帮助你针对给定的需求来选择合适的语句。

特征INSERTUPSERTUPSERT USING LOADLOAD
交易(Transaction)不,使用HBase WAL来恢复不,使用快照(snapshot)来恢复
操作方法(Method of operation)在CheckAndPut会话中,使用标准HBase的写路径。 行在交易协处理器(coprocessor)内存中中止了,除非交易被递交。在Put会话中,使用标准HBase的写路径。在Put会话中,使用标准HBase的写路径。使用HBase bulk加载的写路径,并直接新建HFile文件,在大多数操作中忽略HBase RegionServers。
唯一限制(Uniqueness constraint)强制不强制。有相同键值的行覆盖之前的行。不强制。有相同键值的行覆盖之前的行。只在行集属于单一语句时强制。对已经在表中的行不强制。
索引(Index)能在有索引的表中使用。能在有索引的表中使用。如果在有索引的表中使用,它会转换成UPSERT。能在有索引的表中使用。在LOAD时,索引不起作用。
最大支持(Maximum size)对少于10000*n行适用,这里n是集群中节点的数量。对少于10000*n行适用,这里n是集群中节点的数量。对少于5百万*n行适用,这里n是集群中节点的数量。对少于20亿*n行适用,这里n是集群中节点的数量。
最小支持(Minimum size)1行1行1行对1百万*n行适用
速度(Speed)最慢比INSERT快比UPSERT快最快

接下来这个表个列出了这三种SQL语句不同的数据源,以及每种数据源的相关优点,特别是针对速度方面。这里的目的仍旧是帮助你怎么决定哪种数据源最合适。你对数据源的选择通常会被你收到的需要被加载的数据的格式所影响。所有数据的摄取率将依赖于硬件、行的长度以及列的类型。数据表明现在这里有一套四节点的系统,每个节点有16核,128GB的内存以及一块正规的磁盘。行的长度是150字节,列的类型与TPC-H中的Lineitem表(表示在线商品的信息,译者注)类似。注意: 标记<TBD>单元的吞吐量会在将来被加上。H中的Lineitem表(表示在线商品的信息,译者注)类似。注意: 标记<TBD>单元的吞吐量会在将来被加上

数据源(Data Source)INSERTUPSERTUPSERT USING LOADLOAD
某时刻带有VALUES子句的单行<TBD>。 最慢的方法。<TBD><TBD>
列出带有VALUES子句的行。<TBD>。 速度比行集(Rowset)的INSERT要好。列出调用的CheckAndPut的版本。<TBD>。 速度比行集的UPSERT要好。列出调用的Put的版本。<TBD>。 速度比行集的UPSERT USING LOAD要好。列出调用的Put的版本。
列出有ODBC/JDBC行集的行<TBD><TBD>~ 2.5 GB/hr
本地HBase表<TBD>。作为INSERT的源,速度期望中比Trafodion表要慢,因为编译器没有相关统计资料,并且数据需要加密。<TBD>。作为UPSERT的源,速度期望中比Trafodion表要慢,因为编译器没有相关统计资料,并且数据需要加密。<TBD>。作为UPSERT USING LOAD的源,速度期望中比Trafodion表要慢,因为编译器没有相关统计资料,并且数据需要加密。<TBD>。作为LOAD的源,速度期望中比Trafodion表要慢,因为编译器没有相关统计资料,并且数据需要加密。
Trafodion表<TBD>。作为INSERT的源,速度期望中比Hive表要慢,因为Trafodion扫描慢于Hive扫描。<TBD>。作为UPSERT的源,速度期望中比Hive表要慢,因为Trafodion扫描慢于Hive扫描。<TBD>。作为UPSERT USING LOAD的源,速度期望中比Hive表要慢,因为Trafodion扫描慢于Hive扫描。<TBD>。作为LOAD的源,速度期望中比Hive表要慢,因为Trafodion扫描慢于Hive扫描。
Hive表<TBD>。 INSERT最快源。<TBD>。 UPSERT最快源。TBD>。 UPSERT USING LOAD最快源。Fastest,~100 GB/hr.
连上其余数据源的UDF。速度依赖于数据源与UDF。作为INSERT源时,期望中速度慢于Hive表速度依赖于数据源与UDF。速度依赖于数据源与UDF。速度依赖于数据源与UDF。

...

  1. 在Trafodion集群中,将数据从源头导入进Hive的表。请使用下面方法中的任意一个:
    • 在Trafodion系统中,使用一个类似Apache Sqoop(TM)的工具,来将数据从某个关系型数据库管理系统,就像MySQL或Oracle,迁移到Hive表中。更多信息,请参考使用Sqoop将数据导入进Hive
    • 在Trafodion集群中,将需要被导入进Trafodion中的数据复制到HDFS中。使用Hive外部表来让这些数据能从Hive中看到。更多信息,请参考创建Hive外部表
  2. 使用Trafodion的LOAD语句来将数据从Hive导入进Trafodion表中。更多信息,请参考Bulk加载数据进Trafodion表

如果你想要从某个支持ODBC的数据库中迁移相对少量(只是几百万行)的数据,那么可以使用odb工具,它具有并行数据加载与抓取的能力。更多信息,请参考Trickle加载数据进Trafodion表。你还可以使用ETL工具,像SQuirrel-SQL, Pentaho或者Informatica。这些工具会通过ODBC或者JDBC连接上Trafodion数据库,然后根据合适的行集合大小来递交INSERT语句。预期它们比odb拥有更小的吞吐量。

...

sqoop import --connect jdbc:oracle:thin:@<Oracle host name:port>/<database> --username <user-name> 
--password <password> --table <tablename> --split-by <column-name> --hive-import --create-hive-table 
--hive-table <hive-table-name> --hive-overwrite --null-string '' --null-non-string '' 
--hive-drop-import-delims --verbose
参数指导
--split-by <column-name>默认情况下,如果没有明确拆分列,那sqoop会使用主键列作为拆分列,但这在大多数时候并不是最好的。此外,如果表未定义主键列,你就必须手动明确拆分列。
--null-string <null-string>这是在字符串(string)列中,需要被写入的非空字符串。
--null-non-string <null-string>这是在非字符串(non-string)列中,需要被写入的非空字符串。
--hive-drop-import-delims这是在导入进Hive是,丢掉\n,\r,以及\01字符串域。注意:如果数据包含了\n或\r并且你不使用hive-drop-import-delims选项的话,那么数据将会被清除。在数据迁移中,可以通过定义你喜欢的分隔符(不存在于数据中),来使用额外的Sqoop选项。

...

load with no populate indexes into trafodion.sch.demo select * from hive.hive.demo;

有关LOAD语句的格式,请参考Trafodion SQL Reference Manual (pdf, 3.98 MB)

如果多个LOAD语句一起被用来向单个大表逐渐加载数据集,那对该表的每个分区会有多个Hfile。这会导致SELECT查询时无效率的访问,同时也可能会导致数据紧缩(compaction),这得基于HBase设置中的配置策略。为了避免此种情况,针对表(短期内被两个以上的LOAD语句所加载)采取一个大的数据紧缩可以作为一个很好的实践。为了采取这样的数据紧缩,请使用HBase shell命令:

...

odb工具能被用来向Trafodion表中添加数据。这工具是基于客户端,并通过ODBC与Trafodion相互作用。它可能被安装在Trafodion集群下,或者包含源数据的机器,再或者是用来被加载数据的中间机器。源数据可以在任何支持ODBC的RDBMS(本地或远程)上,或者odb工具所在的机器中的文件里。它允许使用该页列出的四个方法中的三个来将数据加载进Trafodion表:INSERT,UPSERT以及UPSERT USING LOAD。odb工具并不使用bulk加载的LOAD命令,并且使用odb的吞吐量可能会比使用bulk加载要低。不过,使用odb工具的话,源数据不需要独立分步移交到Trafodion集群中。odb工具的复制(copy)命令能够直接从远程RDBMS将数据复制到Trafodion表中。其中,ODBC被用来连接源与目标数据库。线程以及将数据不重复拆分,能用来实现并行。行集(rowset)用来提高吞吐量。目标Trafodion表,在复制或者使用加载命令之前,必须存在。odb工具的安装以及使用格式,在Trafodion odb用户指南(pdf, 632 KB)中有讨论。依照本页中讨论的,UPSERT USING LOAD会在odb工具支持的三种类型的insert中,给出最好的吞吐量。odb默认使用的插入方法是INSERT;想要使用UPSERT USING LOAD,请在odb加载或者复制命令中明确:loadcmd=UL。一个范例的命令行看起来像:

...

有关UPDATE STATISTICS语句的格式,请参考Trafodion SQL Reference Manual (pdf, 3.98 MB)

数据加载问题解答

提高吞吐量

元组列表或行集

当元组列表(Tuplelist)或者行集(Rowset)被用为数据源时,性能通常会因为元组列表或行集中的行数而提升。在某个行数下,性能会到达顶峰,并且会在之后保持相对稳定。峰值依赖于行大小,通常介于100与几千的某个值比较合理。

...

  • 对INSERT以及UPSERT USING LOAD来说,请使用EXPLAIN语句,在Trafodion SQL引用手册SQL Reference Manual (pdf, 3.98 MB)中描述.
  • 对LOAD来说,它被作为一个工具记号(也就是说,次要SQL语句的集合)来实施,使用这条SQL语句来查看往目标表中增加数据的计划:

...