Sqoop提供的--fields-terminated-by选项可以支持指定自定义的分隔符,但是它只支持单字节的分隔符,对于我们特殊的需求:希望使用双字节的“<-T->”,默认的是不支持的。
Sqoop在进行每一次的导出任务时,都会调用codegen,生成一个java文件,并编译打包成一个jar,供MapReduce使用。这个java文件包装了一系列的对导出数据的访问接口,我们可以尝试通过对这个java文件进行分析,找到指定双字节分隔符的方法。
一般地,如果是使用的--query用查询语句获取数据,生成的文件为QueryResult.java,QueryResult.jar,如果使用的是--table,则用指定的表名对相应文件命名。java文件生成在sqoop脚本的同一目录下。
1.修改QueryResult.java文件
生成QueryResult.java到 /home/ncms/sp/sqoopjar2目录中
sqoop codegen --connect jdbc:mysql://192.168.0.1:3306/admin --username admin --password admin --query "SELECT i.*,c.description FROM PUBLISH_INFO i INNER JOIN PUBLISH_CONTENT c
ON i.id=c.id where \$CONDITIONS " --bindir /home/ncms/sp/sqoopjar2 --class-name QueryResult --outdir /home/ncms/sp/sqoopjar2
public String toString(DelimiterSet delimiters, boolean useRecordDelim) {
StringBuilder __sb = new StringBuilder();
String fieldDelim ="<-T->"; //行分隔符同理,在该方法尾部 修改追加为 __sb.append("<-L->") 即可 ;
__sb.append(FieldFormatter.escapeAndEnclose(id==null?"null":"" + id, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(IS_STRUCTURED==null?"null":IS_STRUCTURED, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(is_deleted==null?"null":"" + is_deleted, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(last_modify==null?"null":"" + last_modify, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(table_name==null?"null":table_name, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(table_name2==null?"null":table_name2, delimiters));
2.打jar包
网上找的资料不全,而且比较麻烦,我使用简单方法(针对hadoop2.*)。
a.通过eclipse打jar包 建立QueryResult项目,一个QueryResult.java文件,将 hadoop2.*中的share中jar包和sqoop1.4.1.jar 导入。使用QueryResult.java提示找不到jar包为止。
b.通过eclip打jar包。
注意这一步 , jar包完成
3.运行命令,即可
注意: 我是将 QueryResult.jar放置当前目录下执行的,其他目录没有测试。
sqoop import --connect jdbc:mysql://192.168.0.1:3306/admin --username admin --password admin --query "SELECT * FROM PUBLISH_INFO where \$CONDITIONS " -m 1 --target-dir /sqoop/test232 --class-name QueryResult --jar-file QueryResult.jar
4.验证结果
- 大小: 13.5 KB
- 大小: 60 KB
分享到:
相关推荐
默认情况下, Sqoop使用制表符(\t)作为字段分隔符,但你可以根据需要自定义。问题可能出在以下几个方面: 1. **命令行参数设置**:确保你在运行Sqoop命令时正确指定了`--fields-terminated-by`选项。例如,如果...
Sqoop的1.4.6版本修改部分代码,使--fields-terminated-by支持多分隔符
说明: 版本为:sqoop2-1.99.5-cdh5.10.2 解决数据分隔符 以及 string类型数据存在单引号问题(解决方式 通过更改源码SqoopIDFUtils 里面的分隔符来解决此问题 ) 只需要将以下包进行替换 connector-sdk-1.99.5-...
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,...
- `--hive-delims-replacement`:用自定义字符串替换数据中的特殊字符,如回车和制表符。 - `--hive-drop-import-delims`:导入数据到 Hive 时,自动删除特定的分隔符。 - `--map-column-hive`:映射 Hive 字段...
--fields-terminated-by:字段分隔符。 --hive-import:导入数据到Hive表。 --hive-table:指定Hive表名。 --split-by:用于数据分割的字段名。 -m:Map任务数量。 3. Oozie工作流的创建和配置: 在Hue平台中创建一...
- `--null-string ''` 和 `--null-non-string '0'`:指定字符串类型的NULL值表示为空字符串,非字符串类型的NULL值表示为数字`0`。 ##### 步骤4:清理HDFS中的旧数据 在导入新数据之前,可能需要先清除HDFS上的旧...
- **连接字符串**:`jdbc:mysql://localhost:3306/hive`,表示连接的是本地 MySQL 数据库中的 hive 数据库。 - **用户名**:root,即数据库的登录用户。 - **密码**:123456,该用户的登录密码。 - **表名**:TBLS2...
Sqoop 安装与使用 Sqoop 是一款方便的在传统型数据库与 Hadoop 之间进行数据迁移的工具,充分利用 MapReduce 并行特点以批处理的方式加快数据传输。Sqoop 工具是 Hadoop 下连接关系型数据库和 Hadoop 的桥梁,支持...
还可以使用 `--map-column-java` 或 `--fields-terminated-by` 等选项自定义列分隔符。 6. **运行 Sqoop 命令**: 最后,运行 Sqoop 命令开始数据迁移过程。 关于 `json-to-sqoop.jar`,由于没有提供具体细节,其...
例如,将 `user` 表导入到 `/sqoop/test1` 目录,并设置字段分隔符(`--fields-terminated-by`)和Map数量(`-m`)。如果Map数量为1,不需要`--split-by`,否则需要指定分桶列。 - (2)条件导入:使用 `--where` ...
* –input-null-non-string <null-str>:在生成的java文件中,可以将null字符串设为想要设定的值(比如空字符串’’)。 * –input-null-string <null-str>:同上,设定时,最好与上面的属性一起设置,且设置同样的...
- **性能优化**: 可以通过设置并行度(--num-mappers)、分隔符、列名和列类型等参数来优化导入导出性能。 - **安全性**: 在生产环境中,确保使用安全的方式传递数据库凭证,避免明文存储密码。 6. **其他高级...
Sqoop 支持多种数据类型,包括分隔符文件、Avro 数据、HBase 表、Parquet 文件等。 2. 导出:将 HDFS 中的数据写回到关系型数据库。 Sqoop 可以更新已有的表,或者创建新表来存储数据。 3. 批量插入:为了提高...
- **--null-non-string**:如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值。 ##### 2.2 连接参数 - **--connect**:指定JDBC连接字符串,用于连接关系型数据库。 - **--connection-manager**:...
Sqoop允许用户自定义列映射、指定字段分隔符,并支持数据的压缩存储。 对于增量导入,Sqoop支持两种场景:一种是只导入新增加的数据,适用于日志文件等场景;另一种是可变数据的增量导入,这通常需要记录上一次导入...
要使用 Sqoop,你需要首先配置你的数据库连接信息,然后通过命令行工具指定导入或导出的表、字段、分隔符等参数。例如,从 MySQL 导入数据到 HDFS 的基本命令可能如下: ```bash sqoop import --connect jdbc:mysql...
7. **`--hive-drop-import-delims`**:该选项告诉Sqoop在导入数据时不要使用任何分隔符。这通常用于导入非结构化或半结构化数据,例如CSV文件,但在此上下文中,意味着不希望在导入的数据中包含特定的分隔符。 8. **...
此外,书中还详细解释了如何使用Sqoop进行数据导入和导出,如使用`import`和`export`命令,以及如何处理复杂的数据类型和分隔符。 对于数据转换,Sqoop提供了丰富的转换操作,如使用自定义MapReduce任务进行数据...