sqoop 数据抽取到hive语法 - 日理万妓 2022-08-30 11:42 178阅读 0赞 在使用sqoop将数据库中的数据抽取到hive中时创建语法 ## 全量数据导入 ## 就像名字起的那样,全量数据导入就是一次性将所有需要导入的数据,从关系型数据库一次性地导入到Hadoop中(可以是HDFS、Hive等)。全量导入形式使用场景为一次性离线分析场景。用sqoop import命令,具体如下 # 全量数据导入 sqoop import \ --connect jdbc:mysql://192.168.xxx.xxx:3316/testdb \ --username root \ --password 123456 \ --query “select * from test_table where \$CONDITIONS” \ --target-dir /user/root/person_all \ --fields-terminated-by “,” \ --hive-drop-import-delims \ --null-string “\\N” \ --null-non-string “\\N” \ --split-by id \ -m 6 \ <table> <thead> <tr> <th>参数</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>– query</td> <td>SQL查询语句</td> </tr> <tr> <td>– target-dir</td> <td>HDFS目标目录(确保目录不存在,否则会报错,因为Sqoop在导入数据至HDFS时会自己在HDFS上创建目录)</td> </tr> <tr> <td>–hive-drop-import- delims</td> <td>删除数据中包含的Hive默认分隔符(^A, ^B, \n)</td> </tr> <tr> <td>–null-string</td> <td>string类型空值的替换符(Hive中Null用\n表示)</td> </tr> <tr> <td>–null-non-string</td> <td>非string类型空值的替换符</td> </tr> <tr> <td>–split-by</td> <td>数据切片字段(int类型,m>1时必须指定)</td> </tr> <tr> <td>-m</td> <td>Mapper任务数,默认为4</td> </tr> <tr> <td>--hive-drop-import-delims</td> <td>删除数据中含有的默认的分隔符</td> </tr> <tr> <td>--fields-terminated-by \t</td> <td>这个用来指定数据行的分隔符号</td> </tr> <tr> <td>--lines-terminated-by '\n'</td> <td>用来指定数据行间的分隔符</td> </tr> <tr> <td>--compression-codec lzo</td> <td>用来指定数据表的压缩格式</td> </tr> <tr> <td>--target-dir</td> <td>导入指定的目录中</td> </tr> <tr> <td>--check-column</td> <td>指定增量导入时的参考列</td> </tr> <tr> <td></td> <td></td> </tr> </tbody> </table> ## 增量数据导入 ## 事实上,在生产环境中,系统可能会定期从与业务相关的关系型数据库向Hadoop导入数据,导入数仓后进行后续离线分析。故我们此时不可能再将所有数据重新导一遍,此时我们就需要增量数据导入这一模式了。 增量数据导入分两种, 1. 基于递增列的增量数据导入(Append方式) 2. 基于时间列的增量数据导入(LastModified方式) **Append方式** 举个栗子,有一个订单表,里面每个订单有一个唯一标识自增列ID,在关系型数据库中以主键形式存在。之前已经将id在0~5201314之间的编号的订单导入到Hadoop中了(这里为HDFS),现在一段时间后我们需要将近期产生的新的订单数据导入Hadoop中(这里为HDFS),以供后续数仓进行分析。此时我们只需要指定–incremental 参数为append,–last-value参数为5201314即可。表示只从id大于5201314后开始导入。 # Append方式的全量数据导入 sqoop import \ --connect jdbc:mysql://192.168.xxx.xxx:3316/testdb \ --username root \ --password 123456 \ --query “select order_id, name from order_table where \$CONDITIONS” \ --target-dir /user/root/orders_all \ --split-by order_id \ -m 6 \ --incremental append \ --check-column order_id \ --last-value 5201314 <table> <thead> <tr> <th>参数</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>–incremental append</td> <td>基于递增列的增量导入(将递增列值大于阈值的所有数据增量导入Hadoop)</td> </tr> <tr> <td>–check-column</td> <td>递增列(int)</td> </tr> <tr> <td>–last-value</td> <td>阈值(int)</td> </tr> </tbody> </table> ### **lastModify方式** ### 此方式要求原有表中有time字段,它能指定一个时间戳,让Sqoop把该时间戳之后的数据导入至Hadoop(这里为HDFS)。因为后续订单可能状态会变化,变化后time字段时间戳也会变化,此时Sqoop依然会将相同状态更改后的订单导入HDFS,当然我们可以指定merge-key参数为orser\_id,表示将后续新的记录与原有记录合并。 # 将时间列大于等于阈值的数据增量导入HDFS sqoop import \ --connect jdbc:mysql://192.168.xxx.xxx:3316/testdb \ --username root \ --password transwarp \ --query “select order_id, name from order_table where \$CONDITIONS” \ --target-dir /user/root/order_all \ --split-by id \ -m 4 \ --incremental lastmodified \ --merge-key order_id \ --check-column time \ # remember this date !!! --last-value “2014-11-09 21:00:00” <table> <thead> <tr> <th>参数</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>–incremental lastmodified</td> <td>基于时间列的增量导入(将时间列大于等于阈值的所有数据增量导入Hadoop)</td> </tr> <tr> <td>–check-column</td> <td>时间列(int)</td> </tr> <tr> <td>–last-value</td> <td>阈值(int)</td> </tr> <tr> <td>–merge-key</td> <td>合并列(主键,合并键值相同的记录)</td> </tr> </tbody> </table> ## 并发导入参数如何设置? ## 我们知道通过 -m 参数能够设置导入数据的 map 任务数量,即指定了 -m 即表示导入方式为并发导入,这时我们必须同时指定 - -split-by 参数指定根据哪一列来实现哈希分片,从而将不同分片的数据分发到不同 map 任务上去跑,避免数据倾斜。 * 生产环境中,为了防止主库被Sqoop抽崩,我们一般从备库中抽取数据。 * 一般RDBMS的导出速度控制在60~80MB/s,每个 map 任务的处理速度5~10MB/s 估算,即 -m 参数一般设置4~8,表示启动 4~8 个map 任务并发抽取。 ### ### ### 对换行等特殊字符的替换或者删除 ### <table> <thead> <tr> <th>Argument </th> <th>Description</th> <th>注释</th> </tr> </thead> <tbody> <tr> <td>--hive-home <dir></td> <td>Override $HIVE_HOME</td> <td>覆盖 <code>$HIVE_HOME</code></td> </tr> <tr> <td>--hive-import</td> <td>Import tables into Hive (Uses Hive’s default delimiters if none are set.)</td> <td>将表导入 Hive(如果没有设置,则使用 Hive 的默认分隔符。)</td> </tr> <tr> <td>--hive-overwrite</td> <td>Overwrite existing data in the Hive table.</td> <td>覆盖 Hive 表中的现有数据。</td> </tr> <tr> <td>-create-hive-table</td> <td> If set, then the job will fail if the target hive table exits. By default this property is false.</td> <td> <p>如果设置,那么如果目标配置单元,作业将失败 </p> <p>表退出。默认情况下,此属性为 false。</p> </td> </tr> <tr> <td>--hive-table <table-name></td> <td>Sets the table name to use when importing to Hive.</td> <td>设置导入到 Hive 时要使用的表名。</td> </tr> <tr> <td>--hive-drop-import-delims</td> <td>Drops \n, \r, and \01 from string fields when importing to Hive.</td> <td> 导入到 Hive 时,从字符串字段中删除 \n、 \r和 \01。</td> </tr> <tr> <td>--hive-delims-replacement</td> <td>Replace \n, \r, and \01 from string fields with user defined string when importing to Hive.</td> <td> 导入到 Hive 时,将字符串字段中的<em>\n</em>、 <em>\r</em>和 <em>\01</em>替换 为用户定义的字符串。</td> </tr> <tr> <td>--hive-partition-key </td> <td>Name of a hive field to partition are sharded on</td> <td>要分区的 hive 字段的名称被分片</td> </tr> <tr> <td>--hive-partition-value <v></td> <td> <p> String-value that serves as partition key for this imported into hive in this job.</p> </td> <td>在此作业中用作此导入到配置单元的分区键的字符串值。</td> </tr> <tr> <td>--map-column-hive <map></td> <td>Override default mapping from SQL type to Hive type for configured columns.</td> <td>为配置的列覆盖从 SQL 类型到 Hive 类型的默认映射。</td> </tr> </tbody> </table> 使用方法, 1、在原有sqoop语句中添加 --hive-delims-replacement “ ” 可以将如mysql中取到的\\n, \\r, and \\01等特殊字符替换为自定义的字符,此处用了空格 2、在原有sqoop语句中添加 --hive-drop-import-delims 可以将如mysql中取到的\\n, \\r, and \\01等特殊字符丢弃 版权声明:本文为CSDN博主「grootblockchain」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 摘抄自:https://blog.csdn.net/CaptainJava/article/details/82625858 摘抄自:[https://blog.csdn.net/qq\_35495339/article/details/95619461][https_blog.csdn.net_qq_35495339_article_details_95619461] [https_blog.csdn.net_qq_35495339_article_details_95619461]: https://blog.csdn.net/qq_35495339/article/details/95619461
还没有评论,来说两句吧...