天道酬勤,学无止境

用于 Sqoop 拆分列的 Oracle ROWID(Oracle ROWID for Sqoop Split-By Column)

问题

我有一个巨大的 oracle 表(事务),我的 oracle 表中的数据在“Customer id”列上有偏斜数据,因此少数映射器需要数小时才能完成工作,而其他映射器则在几分钟内完成工作。 我看不到任何其他选项来避免倾斜数据,因为这是唯一可以拆分的列。 我们可以结合其他列,如客户 ID、批次 ID、SEQ NUM 来进行多列拆分,但我知道 sqoop 不支持多列拆分。

我的目标是提取特定时期的交易数据(即一个月数据的唯一批次日期)。

我在带有 10 个映射器的 sqoop 中尝试了以下选项。

--split-by "my column name"           //for example customer id
--where "my query condition"         //for example batch date

现在我正在考虑使用 ROWID,它可能会在映射器之间均匀地分割行。 我想到了使用边界查询来获取 MIN & MAX ROW ID。 下面是我想使用的 Sqoop 命令。

sqoop import \
--table Transaction \
--split-by ROWID \
--where "BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY')" \
--boundary-query "SELECT MIN(ROWID) AS MIN, MAX(ROWID) AS MAXL FROM Transaction WHERE BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY') GROUP BY CUSTOMERID, BATCHNO,BATCHSEQNO " \
--num-mappers 10 \
--target-dir /user/trans

需要建议这是否是正确的选择或是否有任何其他方式。

另外我想知道我们是否可以随时使用多个拆分列名。

回答1

提供--boundary-query只会节省您评估最小值和最大值的时间。 所有映射器将具有相同的范围查询。

在您的情况下,sqoop 将生成边界查询,如 -

SELECT MIN(ROWID), MAX(ROWID) FROM (Select * From Transaction WHERE BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY') ) t1

您可以在 JDBC 客户端上尝试此查询和自定义边界查询,以检查哪个更快并使用那个。

现在来到不均匀的映射器负载。

你是对的。 目前,sqoop 不支持多列拆分。 你必须选择一列。 如果ROWID分布均匀(我假设是),您应该使用它。

所以,你的查询看起来不错。 只需检查 compare --boundary-query


编辑

Oracle 的ROWID类型没有正确的 java 类型问题。

在导入命令中添加--map-column-java ROWID=String以将其映射到 Java 的字符串。

回答2

你有 SEQ NUM 的索引吗,如果有,那么你可以在 --split-by 中使用 SEQ-NUM(我假设 SEQ-NUM 没有随机生成它是为每个事务以增量方式填充的)。 所以你的 sqoop 命令可能看起来像这样

sqoop import \ 
--table Transaction \
--split-by SEQ-NUM \
--where "BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY')" \ 
--num-mappers 10 \
--target-dir /user/trans
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Oracle ROWID for Sqoop Split-By Column
    I have a huge oracle table (Transaction), the data in my oracle table has skew data on the column "Customer id" due to which the few mappers take time in hours to finish the job while other mappers finish the job in minutes. I couldn't see any other option to avoid the skewing data as this is the only column can be splited by. We can combine other columns like Customer ID, Batch ID, SEQ NUM to come with multi column split but I understood that sqoop doesn't support multi column in split by. My objective is to pull the transaction data for a specific period (i.e. batch date unique for a month
  • Sqoop导入按列数据类型拆分(Sqoop Import Split by Column Data type)
    问题 sqoop导入中按列拆分的数据类型是否应该始终是数字数据类型(整数、bignint、数字)? 不能是字符串吗? 回答1 是的,您可以拆分任何非数字数据类型。 但不建议这样做。 为什么? 用于拆分数据 Sqoop fires SELECT MIN(col1), MAX(col2) FROM TABLE 然后根据你的映射器数量划分它。 现在以整数作为--split-by列的例子 表有一些值为 1 到 100 的id列,并且您使用了 4 个映射器( -m 4在您的 sqoop 命令中) Sqoop 使用以下方法获取 MIN 和 MAX 值: SELECT MIN(id), MAX(id) FROM TABLE 输出: 1,100 在整数上拆分很容易。 您将制作 4 个部分: 1-25 25-50 51-75 76-100 现在字符串为--split-by列 表有一些name列,其值为“dev”到“sam”,并且您使用了 4 个映射器( -m 4在您的 sqoop 命令中) Sqoop 使用以下方法获取 MIN 和 MAX 值: SELECT MIN(id), MAX(id) FROM TABLE 输出: 开发,一个人 现在它将如何分为 4 个部分。 根据 sqoop 文档, /** * This method needs to determine the splits
  • sqoop中的以下命令是什么?(what are the following commands in sqoop?)
    问题 谁能告诉我sqoop中的--split-by和boundary查询有什么用? sqoop import --connect jdbc:mysql:// localhost / my --username user --password 1234 --query'select * from table where id = 5 AND $ CONDITIONS'--split-by table.id --target-目录/ dir 回答1 --split-by:用于指定用于生成导入拆分的表的列。 这意味着它指定在将数据导入到群集中时将使用哪一列来创建拆分。 它可以通过实现更大的并行度来增强导入性能。 Sqoop根据用户通过导入命令由--split-by指定的表的特定列中的值创建拆分。 如果不可用,则使用输入表的主键创建拆分。 使用原因:有时主键的最小值和最大值之间没有均匀的值分布(如果--split-by不可用,则用于创建拆分)。 在这种情况下,您可以指定其他一些具有适当数据分布的列,以创建有效导入的拆分。 --boundary-query:默认情况下,sqoop将使用查询select min(),max()from来查找创建拆分的边界。 在某些情况下,该查询不是最佳查询,因此您可以使用--boundary-query参数指定返回两个数字列的任意查询。 使用原因:如果-
  • 在RDBMS中没有主键的Sqoop导入(Sqoop import without primary key in RDBMS)
    问题 我可以导入RDBMS表数据(表没有主键)以使用sqoop进行配置吗? 如果是,那么可以请给sqoop import命令。 我已经尝试使用sqoop import general命令,但是失败了。 回答1 如果您的表没有定义主键,那么您必须给-m 1选项以导入数据,或者必须为--split-by参数提供一些列名,否则会出现错误: ERROR tool.ImportTool: Error during import: No primary key could be found for table <table_name>. Please specify one with --split-by or perform a sequential import with '-m 1' 然后您的sqoop命令将如下所示 sqoop import \ --connect jdbc:mysql://localhost/test_db \ --username root \ --password **** \ --table user \ --target-dir /user/root/user_data \ --columns "first_name, last_name, created_date" -m 1 或者 sqoop import \ --connect jdbc:mysql:/
  • Sqoop-数据拆分(Sqoop - Data splitting)
    问题 Sqoop能够使用--query子句从多个表中导入数据,但不清楚是否能够在查询下面导入。 从emp组中按deptid选择deptid,avg(salary) 另一个问题是 sqoop import --connect jdbc:mysql:// myserver:1202 / --username = u1 --password = p1 --query'从emp中选择*,其中empid <1123和$ CONDITIONS'--split-by empid --target -dir / uname / emp / salary $ CONDITIONS和split-by用于执行并行处理,或者可以说有效地导入了数据。 前者根据条件拆分行,后来在主键上使用最小和最大逻辑。 两者之间有什么区别($CONDITIONS, split-by) 。 如果我们在同一个sqoop语句中同时使用这两个子句,哪个子句将具有优先权? 谢谢.... 回答1 您的理解有些差距。 首先,并行度由-m <n>或--num-mappers <n> 。 默认情况下--num-mappers值为4。 其次,-- --split-by <column-name> ,将基于列名拆分任务。 第三, $CONDITIONS ,它在内部由sqoop使用以完成此拆分任务。 范例,您触发了一个查询: sqoop
  • Sqoop将Hive和Sqlserver、Oracle数据的导入导出
    补充:使用sqoop导入导出hive数据到sqlserver只需要将sqljdbc4-4.jar包放到sqoop lib目录下即可,jar包可以在网上下载,或者去https://download.csdn.net/download/xinguopeng/12445475 下载 一、数据导出Hive 1、部分字段导出,指定表目录 sqoop export --connect ‘jdbc:sqlserver://localhost:1433;username=sa;password=1;database=test_db’ --table t_test --columns “city_code,city_name,total_times,dt” --export-dir /home/hadoop/hive_date/warehouse/db_test.db/t_test/dt=2020 --input-fields-terminated-by ‘\001’; 注意: –columns指定的是sqlserver中表的字段,顺序要和hive表中字段顺序对应上; –input-fields-terminated-by ‘\001’ 指定hive字段分隔符 二、数据导入Hive 1、把数据导入到hdfs sqoop import --connect ‘jdbc:sqlserver://192
  • Sqoop学习记录
    Sqoop数据迁移工具 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、 postgresql等)间进行数据的传递。可以将关系型数据库(MySQL ,Oracle ,Postgres 等)中的数据导入到HDFS中,也可以将HDFS的数据导进到关系型数据库中。 安装配置 Sqoop 官网:http://sqoop.apache.org/ Sqoop 下载地址:http://www.apache.org/dyn/closer.lua/sqoop/ 1. 下载、上传并解压 将下载的安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 上传到虚拟机中; 解压缩软件包; tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz mv sqoop-1.4.7.bin__hadoop-2.6.0/ ../servers/sqoop-1.4.7/ 2. 增加环境变量,并使其生效 vi /etc/profile # 增加以下内容 export SQOOP_HOME=/opt/lagou/servers/sqoop-1.4.7 export PATH=$PATH:$SQOOP_HOME/bin source /etc/profile 3. 创建、修改配置文件 # 配置文件位置
  • Sqoop增量导入check-column中的多列(Sqoop Incremental Import multiple columns in check-column)
    问题 如何基于多列从Oracle导入增量数据? sqoop import --connect jdbc:oracle:thin:ip/dbname --username sqoop --password sqoop \ --query 'SELECT * FROM tablename WHERE $CONDITIONS' \ --check-column column1,column2 \ --incremental lastmodified \ --last-value "2010-05-22 01:01:01" \ -fields-terminated-by \| \ --target-dir /directoryname` --split-by id -m 1 当我使用它时,column2 无法识别并且它抛出一个错误。 在这方面需要帮助。 回答1 这真的取决于 Sqoop Incremental 应该对这两列做什么...... 您想获取 column1 大于 last-value 的所有行吗? 第 2 列? 哪个更大? 哪个较小? 因为 sqoop 不知道您想如何组合它们,所以它不支持多列。 但是,您可以自己组合它们并使用函数作为 --check-column。 例如:--check-column nvl(column1,column2) 或 --check-column
  • 使用 where 子句进行 SQL 查询的 Sqoop 导入(Sqoop import having SQL query with where clause)
    问题 sqoop import --connect jdbc:teradata://192.168.xx.xx/DBS_PORT=1025,DATABASE=ds_tbl_db --driver com.teradata.jdbc.TeraDriver --username dbc --password dbc --query 'select * from reason where id>20' --hive-import --hive-table reason_hive --target-dir <hdfs-location> -m 1 我得到了错误: 查询 [select * from reason where id>20] 必须在 WHERE 子句中包含“$CONDITIONS”。 我知道在查询 Sqoop 时必须有一个 where 子句。 所以,对于像这样的查询 select * from reason 我将其修改为: select * from reason WHERE $CONDITIONS 对于具有where子句的查询该怎么办? 回答1 你必须添加AND \$CONDITIONS --query "select * from reason where id>20 AND \$CONDITIONS" 请参阅 Sqoop 文档。 回答2 Sqoop 需要访问表的元数据
  • 将 BLOB(图像)从 oracle 导入 hive(Import BLOB (Image) from oracle to hive)
    问题 我正在尝试使用以下 Sqoop 命令将 BLOB(图像)数据表单 oracle 导入 Hive。 sqoop import --connect jdbc:oracle:thin:@host --username --password --m 3 --table tablename --hive-drop-import-delims --hive-table tablename --target-dir '' --split-by id; 但没有成功。 请记住,BLOB 数据以十六进制形式存储在 oracle 数据库中,我们需要将其以文本或二进制形式存储到 Hive 表中。 有什么可能的方法来做到这一点? 回答1 Sqoop 不知道如何将 oracle 中的 blob 数据类型映射到 Hive。 所以你需要指定--map-column-hive COLUMN_BLOB=binary sqoop import --connect 'jdbc:oracle:thin:@host' --username $USER --password $Password --table $TABLE --hive-import --hive-table $HiveTable --map-column-hive COL_BLOB=binary --delete-target-dir --target
  • 导入失败:在从 Oracle 数据库导入 CLOB 数据期间无法转换 SQL 类型 2005==>(Imported Failed: Cannot convert SQL type 2005==> during importing CLOB data from Oracle database)
    问题 我正在尝试使用 sqoop 导入具有 CLOB 数据类型的 Oracle 表的数据,但失败并显示错误Imported Failed: Cannot convert SQL type 2005 。 我正在使用Running Sqoop version: 1.4.5-cdh5.4.7 。 请帮助我如何导入 CLOB 数据类型。 我正在使用下面的 oozie 工作流程来导入数据 <workflow-app xmlns="uri:oozie:workflow:0.4" name="EBIH_Dly_tldb_dly_load_wf"> <credentials> <credential name="hive2_cred" type="hive2"> <property> <name>hive2.jdbc.url</name> <value>${hive2_jdbc_uri}</value> </property> <property> <name>hive2.server.principal</name> <value>${hive2_server_principal}</value> </property> </credential> </credentials> <start to="sqp_imp_tldb_table1"/> <action name="sqp_imp
  • Sqoop Incremental Import multiple columns in check-column
    How to import the Incremental data from Oracle based on multiple columns? sqoop import --connect jdbc:oracle:thin:ip/dbname --username sqoop --password sqoop \ --query 'SELECT * FROM tablename WHERE $CONDITIONS' \ --check-column column1,column2 \ --incremental lastmodified \ --last-value "2010-05-22 01:01:01" \ -fields-terminated-by \| \ --target-dir /directoryname` --split-by id -m 1 When I use this, column2 is not recognized and it's throwing an error. Need help on this.
  • Sqoop数据迁移,导入数据至hdfs,hive,hbase,mysql
    Sqoop数据迁移 一、Sqoop概述二、Sqoop数据迁移1.从RDB(Relational Database)导入数据到HDFS1.1全量导入数据(customers)1.2通过Where语句过滤导入表(orders)1.3通过COLUMNS过滤导入表(customers)1.4使用query方式导入数据1.5使用Sqoop增量导入数据 2.从RDB(Relational Database)导入数据到hive3.从RDB(Relational Database)导入数据到HBase4.从hdfs导出数据到MySQL 三、执行Sqoop脚本四、执行Sqoop job任务 一、Sqoop概述 Sqoop是什么? Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具。 将数据从RDBMS(Relational Database Management System)导入到HDFS、Hive、HBase 从HDFS导出数据到RDBMS 使用MapReduce导入和导出数据,提供并行操作和容错。 对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时,确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。 二、Sqoop数据迁移 1
  • Subprocess Popen : Ignore Accumulo warning and continue execution of Sqoop
    I am using Python 2.7. I am trying to execute sqoop command using Python subprocees.Popen to transfer a table to HDFS. Whenever, I do Popen(sqoop_cmd, stdout=subprocess.PIPE), it is returning with process.poll() status 1. Looking into the output, I am getting Warning: /opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.21/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. It is not running past this point. But if I run the same command on linux terminal I am get this warning but it continues execution. Warning
  • Imported Failed: Cannot convert SQL type 2005==> during importing CLOB data from Oracle database
    I am trying to import a Oracle table's data with CLOB data type using sqoop and it is failing with the error Imported Failed: Cannot convert SQL type 2005. I am using Running Sqoop version: 1.4.5-cdh5.4.7. Please help me how to import CLOB data type. I am using the below oozie workflow to import the data <workflow-app xmlns="uri:oozie:workflow:0.4" name="EBIH_Dly_tldb_dly_load_wf"> <credentials> <credential name="hive2_cred" type="hive2"> <property> <name>hive2.jdbc.url</name> <value>${hive2_jdbc_uri}</value> </property> <property> <name>hive2.server.principal</name> <value>${hive2_server
  • 何时使用 Sqoop --create-hive-table(When to use Sqoop --create-hive-table)
    问题 谁能说出create-hive-table和hive-import方法之间的区别? 两者都将创建一个 hive table,但是每个的意义是什么? 回答1 配置单元导入命令: hive-import命令自动为 hive Metastore 中的填充表填充元数据。 如果 Hive 中的表尚不存在,Sqoop 将根据为您的表或查询获取的元数据简单地创建它。 如果该表已经存在,Sqoop 会将数据导入到现有表中。 如果您要创建新的 Hive 表,Sqoop 会将源表中每一列的数据类型转换为与 Hive 兼容的类型。 创建蜂巢表命令: Sqoop 可以根据现有关系数据源中的表生成 hive 表(使用create-hive-table命令)。 如果设置,则如果目标配置单元表存在,则作业将失败。 默认情况下,此属性为 false。 使用create-hive-table命令包括三个步骤:将数据导入 HDFS,创建 hive 表,然后将 HDFS 数据加载到 Hive。 这可以通过使用hive-import缩短为一步。 在hive-import期间,Sqoop 将首先将正常的 HDFS 导入到临时位置。 成功导入后,Sqoop 生成两个查询:一个用于创建表,另一个用于从临时位置加载数据。 您可以使用--target-dir或--warehouse-dir参数指定任何临时位置。
  • Sqoop导入
    “导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据 下面的语法用于将数据导入HDFS: $ sqoop import (generic-args) (import-args) Sqoop测试表数据 在mysql中创建数据库userdb,然后执行参考资料中的sql脚本: 创建三张表: emp雇员表、 emp_add雇员地址表、emp_conn雇员联系表。 1.全量导入mysql表数据到HDFS 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。 bin/sqoop import \ --connect jdbc:mysql://node-1:3306/userdb \ --username root \ --password hadoop \ --delete-target-dir \ --target-dir /sqoopresult \ --table emp --m 1 其中 –target-dir可以用来指定导出数据存放至HDFS的目录; mysql jdbc url 请使用 ip 地址。 为了验证在HDFS导入的数据,请使用以下命令查看导入的数据: hdfs dfs -cat /sqoopresult/part-m-00000 可以看出它会在HDFS上默认用逗号,分隔emp表的数据和字段。可以通过
  • Sqoop导入:复合主键和文本主键(Sqoop import : composite primary key and textual primary key)
    问题 堆栈:使用Ambari 2.1安装了HDP-2.3.2.0-2950 源数据库模式位于sql server上,它包含几个表,这些表的主键为: varchar 复合-2个varchar列或1个varchar + 1个int列或2个int列。 有一张大桌子吗? 在PK中具有三列的行,一个int +两个varchar列 根据Sqoop文档: Sqoop cannot currently split on multi-column indices. If your table has no index column, or has a multi-column key, then you must also manually choose a splitting column. 第一个问题是:“手动选择拆分列”会带来什么?我该如何牺牲pk而仅使用一个列呢?还是我错过了一些概念? SQL Server表是(仅两列,它们形成一个复合主键): ChassiNo varchar(8) Unchecked ECU_Name nvarchar(15) Unchecked 我进行了导入,源表中有7909097条记录: sqoop import --connect 'jdbc:sqlserver://somedbserver;database=somedb' --username
  • Sqoop 增量导入(Sqoop Incremental Import)
    问题 需要有关 Sqoop 增量导入的建议。 假设我有一个客户在第 1 天使用策略 1,我在第 1 天将这些记录导入 HDFS,我在部件文件中看到它们。 在第 2 天,同一个客户添加了策略 2,并且在增量导入 sqoop 运行后,我们是否只会在零件文件中获得新记录? 在这种情况下,如何使用 Sqoop 获取旧的和增量的附加/最后修改的记录? 回答1 考虑一个包含 3 条记录的表,您已经使用 sqoop 将这些记录导入到 hdfs +------+------------+----------+------+------------+ | sid | city | state | rank | rDate | +------+------------+----------+------+------------+ | 101 | Chicago | Illinois | 1 | 2014-01-25 | | 101 | Schaumburg | Illinois | 3 | 2014-01-25 | | 101 | Columbus | Ohio | 7 | 2014-01-25 | +------+------------+----------+------+------------+ sqoop import --connect jdbc:mysql://localhost
  • Sqoop配置与基本操作
    Sqoop配置与基本操作 一、Sqoop配置1、解压文件2、拷贝jar包3、配置sqoop.env4、配置环境变量5、启动mysql,hadoop,hive服务6、测试 二、Sqoop基本操作1、mysql->hdfs,把mysql(RDBMS)的数据导入到hdfs2、hdfs->mysql,使用sqoop把hdfs里的文件导出到mysql(RDBMS)里3、mysql->hive,从mysql(RDBMS)中导入到HIVE4、mysql->hbase,把mysql(RDBMS)的数据导入到 Hbase4.1、bulkload可能遇到的问题5、hbase->hive,hbase导出到hive6、mysql->hdfs,根据指定的字段条件增量导出7、mysql->hdfs,根据时间戳增量导出 三、创建sqoop job1、设置免密登陆2、创建sqoop job 四、常用指令解释五、定时任务完整流程 一、Sqoop配置 1、解压文件 #解压sqoop压缩文件 [root@chust01 hadoop]# tar -zxvf /opt/download/hadoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C ./ #查看解压后的文件,改名为简易版名称sqoop146 [root@chust01 hadoop]# ls [root