sqoop的sql语言导入方式

bash 复制代码
sqoop import \
--connect jdbc:mysql://node00:3306/sqoop_export \
--username root \
--password 1234567 \
--target-dir /sqoop/emp3 \
--delete-target-dir \
--query "select * from emp_out where id<1203 and \$CONDITIONS" \
--input-fields-terminated-by "," \
--split-by id

这段 Sqoop 代码的主要作用是从 MySQL 数据库中导入符合特定条件的数据到 Hadoop 的 HDFS 中,下面为你详细解释代码中各部分的含义:

整体功能概述

就好比你有一个装满各种物品的大仓库(MySQL 数据库),你想要把仓库里某些特定的物品(符合条件的数据)挑选出来,然后搬到另一个大的存储场地(HDFS)里去,Sqoop 就像是负责搬运这些物品的 "搬运工"。

代码逐行解释

sqoop import

这是 Sqoop 的导入命令,意思就是要把数据从其他数据源(这里是 MySQL 数据库)导入到 Hadoop 的 HDFS 中,类似于告诉 "搬运工" 要开始从仓库往存储场地搬东西了。

--connect jdbc:mysql://node00:3306/sqoop_export
  • --connect:指定要连接的数据源地址。
  • jdbc:mysql://:表示使用 JDBC 协议连接 MySQL 数据库。
  • node00:是 MySQL 数据库所在服务器的主机名或者 IP 地址,就像是仓库所在的具体位置。
  • 3306:是 MySQL 数据库的默认端口号,相当于进入仓库的 "门牌号"。
  • sqoop_export:是要连接的 MySQL 数据库的名称,也就是仓库里具体的一个存放区域。
--username root

指定连接 MySQL 数据库使用的用户名,这里是 root,可以理解为进入仓库需要的身份凭证中的用户名部分。

--password 1234567

指定连接 MySQL 数据库使用的密码,这里是 123456,相当于身份凭证中的密码部分,和用户名一起才能成功进入仓库。

--target-dir /sqoop/emp3

指定数据导入到 HDFS 中的目标目录,即 /sqoop/emp3,这就好比告诉 "搬运工" 把挑选好的物品放到存储场地的哪个具体位置。

--delete-target-dir

在导入数据之前,先删除目标目录(也就是 /sqoop/emp3)下的所有内容。这就像是在把新物品放到存储场地的指定位置之前,先把这个位置原来的东西都清理掉。

--query "select * from emp_out where id<1203 and \$CONDITIONS"
  • --query:用于指定从数据库中查询数据的 SQL 语句。
  • select * from emp_out:表示从 emp_out 表中查询所有列的数据,emp_out 表就像是仓库里的一个货架。
  • where id<1203:是查询的过滤条件,只选取 id 小于 1203 的记录,相当于只挑选货架上编号小于 1203 的物品。
  • and \$CONDITIONS:这是 Sqoop 要求的固定写法,用于在并行导入时添加额外的查询条件,保证数据正确分割。
--input-fields-terminated-by ","

指定从数据库中读取的数据字段之间的分隔符为逗号 ,。可以想象成仓库里的物品是按照逗号来区分不同属性的,搬运工在搬运过程中也按照这个规则来处理。

--split-by id

指定按照 id 字段对数据进行分割,以便进行并行导入。这就好比把要搬运的物品按照编号分成不同的批次,多个 "搬运工" 可以同时搬运不同批次的物品,提高搬运效率。

--query "select * from emp_out where id<1203 and \$CONDITIONS"单引号与双引号?

使用双引号的情况:

bash 复制代码
sqoop import \
--connect jdbc:mysql://node00:3306/sqoop_export \
--username root \
--password 123456 \
--target-dir /sqoop/emp3 \
--delete-target-dir \
--query "select * from emp_out where id<1203 and \$CONDITIONS" \
--input-fields-terminated-by "," \
--split-by id
  • 变量解析 :在大多数 shell 环境(如 Bash)中,双引号会让 shell 对其中的变量进行解析。在上述例子里,$CONDITIONS 是 Sqoop 需要的一个特殊占位符,用于并行导入时添加额外的查询条件。使用双引号时,需要对 $ 进行转义(即写成 \$),否则 shell 会尝试去解析 $CONDITIONS 这个变量,而它在 shell 环境中通常是没有定义的,就会导致错误。
  • 优点:适合需要在查询语句中嵌入 shell 变量的情况。例如,如果你想动态地根据某个 shell 变量来构建查询条件,可以这样做:

使用单引号的情况:

bash 复制代码
sqoop import \
--connect jdbc:mysql://node00:3306/sqoop_export \
--username root \
--password 123456 \
--target-dir /sqoop/emp3 \
--delete-target-dir \
--query 'select * from emp_out where id<1203 and $CONDITIONS' \
--input-fields-terminated-by "," \
--split-by id
  • 禁止变量解析 :单引号会阻止 shell 对其中的内容进行变量解析,所以 $CONDITIONS 会原样传递给 Sqoop,不会被 shell 误解。这样就不需要对 $ 进行转义。
  • 优点:当查询语句中不涉及 shell 变量时,使用单引号可以避免变量解析带来的潜在问题,让查询语句更加简洁和直观。

总结

  • 如果查询语句中需要嵌入 shell 变量,使用双引号,但要注意对特殊字符(如 $)进行转义。
  • 如果查询语句中没有需要 shell 解析的变量,使用单引号更为方便和安全。
相关推荐
IT_陈寒39 分钟前
SpringBoot启动慢得像蜗牛?原来是这个配置在捣鬼
前端·人工智能·后端
计算机魔术师40 分钟前
Muse Spark跑赢Gemini,但真正的底牌是这种设计
前端
PYB31 小时前
【Web·JS·基础】函数的使用和展运算符...objs
前端·javascript
指针向南1 小时前
Chrome读不了HEIC怎么办:原生解码和WASM两条路
前端·图像处理·人工智能·chrome·计算机视觉·wasm
默_笙2 小时前
🚥 给 RAG 装一台心电监护仪:LangSmith 全链路观测(上)
前端·javascript
前端snow3 小时前
ai agent --- mem0 外挂记忆系统
前端
特立独行的猫a4 小时前
用仓颉写一个 Tauri:IPC 的每次往返实现原理(web层到仓颉层的触发过程)
前端·ui·harmonyos·tauri·鸿蒙·仓颉
Dovis(誓平步青云)4 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
骑着蜗牛撵大象3274 小时前
Qt 事件机制详解:从 QEvent 派生类到事件过滤器的全景指南
前端·python
qq_2518364574 小时前
理发管理系统 —— 会员模块
开发语言·前端·python·flask