使用sqoop导入数据至hive常用语句
直接导入hive表
sqoop import --connect jdbc:postgresql://ip/db_name--username user_name --table table_name --hive-import -m 5
内部执行实际分三部,1.将数据导入hdfs(可在hdfs上找到相应目录),2.创建hive表名相同的表,3,将hdfs上数据传入hive表中
sqoop根据postgresql表创建hive表
sqoop create-hive-table --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-table hive_table_name( --hive-partition-key partition_name若需要分区则加入分区名称)
导入hive已经创建好的表中
sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);
使用query导入hive表
sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --query "select ,* from retail_tb_order where \$CONDITIONS" --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);
注意:$CONDITIONS条件必须有,query子句若用双引号,则$CONDITIONS需要使用\转义,若使用单引号,则不需要转义。
遇到问题
若需要在导入hive数据表的前提下,再添加在原有关系型数据库中没有的一列数据如何解决。
首先,我们想到的是添加一个partition可很方便的添加“一列”数据,partition的使用很类似普通一列,常用的sql执行是没有问题的。
其次,想到在query的sql中添加一个常量或者一个变量,例如:”select 'hello',* from retail_tb_order where \$CONDITIONS“,执行后会报异常
12/08/28 14:41:31 INFO tool.CodeGenTool: Beginning code generation
12/08/28 14:41:31 INFO manager.SqlManager: Executing SQL statement: select 'hello',* from retail_tb_order where (1 = 0)
12/08/28 14:41:32 INFO manager.SqlManager: Executing SQL statement: select 'hello',* from retail_tb_order where (1 = 0)
12/08/28 14:41:32 ERROR orm.ClassWriter: Cannot resolve SQL type 1111
12/08/28 14:41:32 ERROR orm.ClassWriter: Cannot resolve SQL type 1111
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_
12/08/28 14:41:32 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.sqoop.orm.ClassWriter.parseNullVal(ClassWriter.java:900)
at org.apache.sqoop.orm.ClassWriter.parseColumn(ClassWriter.java:925)
at org.apache.sqoop.orm.ClassWriter.generateParser(ClassWriter.java:999)
at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1314)
at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1138)
at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:82)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:367)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:453)
at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57)
该问题出现原因是sqoop ClassWriter类会在postgresql表中解析sql中的所有列,当解析常量'hello'时,数据库没有该列也就找不到相应的数据类型。
若要解决该问题应该需修改ClassWriter源码。
分享到:
相关推荐
最初的设计方案是通过 Sqoop 将数据从 PostgreSQL 导入到 Kafka,再通过存储程序将 Kafka 的数据保存至 Hive 或 HBase 中。然而,在实施过程中遇到了 Sqoop 版本兼容性问题: - **Sqoop1**:适用于命令行模式执行。...
sqoop连接Postgres SQL 的驱动包postgresql-9.3-1102-jdbc41.jar。 利用sqoop导出PostgresSQL的数据时所需的驱动包,只需要将该包放到hive或sqoop的lib目录下即可。
例如,企业可能需要定期从关系数据库中抽取数据,通过Sqoop导入到Hadoop集群,然后使用Hive进行数据清洗、转换和分析,最后将结果写回数据库或生成报告。 在实际应用中,我们还需要考虑性能优化。对于Hive,这可能...
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle )中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进...
Sqoop 可以用于将数据从关系数据库管理系统导入到 Hive,或者从 Hive 导出数据到关系数据库管理系统。 Sqoop 是一个功能强大且易于使用的数据传输工具,广泛应用于数据仓库、数据挖掘、商业智能、Big Data 等领域。...
通过 Sqoop,你可以将大量结构化数据从 RDBMS(如 MySQL、Oracle、PostgreSQL 等)导入到 HDFS(Hadoop 分布式文件系统),反之亦然。 2. ** Sqoop 的工作原理** Sqoop 使用 MapReduce 框架执行数据导入导出任务,...
- Hive:通过 Sqoop 可以直接将数据导入 Hive 表,方便后续进行数据分析。 - Oozie:可以将 Sqoop 任务作为 Oozie 工作流的一部分,实现自动化数据同步。 - Pig:结合 Pig,可以在导入数据后进行复杂的数据分析。...
全量导入将整个数据库表复制到HDFS,而增量导入则只导入自上次导入以来发生变化的数据,这通常通过时间戳或序列号来跟踪。 4. **数据转换**:在导入数据时,用户可以指定预定义的或自定义的MapReduce任务来进行数据...
5. 元数据保留:Sqoop 可以保存关于导入作业的元数据,包括表结构、分区信息等,便于后续的导入操作。 6. 故障恢复:如果在数据迁移过程中出现故障,Sqoop 提供了断点续传功能,可以在恢复时继续未完成的工作。 7....
7. **分块导入**:对于大型数据集,Sqoop 可以将导入过程划分为多个小任务,每个任务处理一部分数据。这有助于充分利用集群资源,加速数据导入。 8. **数据类型转换**:Sqoop 自动处理 RDBMS 数据类型到 Hadoop 的 ...
`sqoop import` 命令用于将数据从关系型数据库导入到 HDFS 或 Hive 表中。 ##### 7.2 语法 - **7.2.1 连接到数据库服务器**:使用 `--connect` 参数指定数据库 URL,如 `jdbc:mysql://localhost/mydb?useSSL=false...
4. **元数据保留**:在导入过程中,Sqoop 可以将表结构和列信息保存在 HCatalog 或 Hive Metastore 中,方便后续的 Hive 查询或其他分析任务。 5. **增量导入**:Sqoop 支持基于时间戳或序列号的增量导入,确保只...
5. **数据分片**:在导入过程中, Sqoop 可以根据表的大小和集群资源动态地划分数据,以优化导入性能。 6. **元数据保留**:Sqoop 支持保存关于导入导出的元数据,方便后续的重复使用和数据追踪。 **CDH3B4**: ...
- **目的**:基于导入的数据创建Hive表。 - **示例调用**:创建Hive表的实际操作。 - **sqoop-eval**: - **目的**:执行SQL查询并输出结果。 - **示例调用**:SQL查询示例。 - **sqoop-list-databases**/ **...
- **集成Sqoop**: 使用`--hive-import`选项,可以直接将导入的数据创建为Hive表,方便后续使用HQL进行数据分析。 5. **使用注意事项** - **元数据同步**: 当从数据库导入数据到Hadoop时,Sqoop并不自动处理数据库...
1. **数据导入**:用户可以通过SQL查询选择需要导入的数据,Sqoop会自动创建一个MapReduce作业,将数据分割并分配给集群中的各个节点进行并行处理,最终将结果合并并存储到HDFS中。 2. **数据导出**: Sqoop同样...
1. **数据导入**:Sqoop 可以将结构化的数据从关系型数据库管理系统(RDBMS)如 MySQL、Oracle 等导入到 HDFS,然后可以进一步使用 MapReduce 或 Hive 进行分析和处理。 2. **数据导出**:反之,Sqoop 也可以将 HDFS...
通过 Sqoop,用户可以将数据从 RDBMS 导入到 HDFS,进而处理 Hadoop MapReduce 或 Hive 等工具,同时也能将处理后的结果重新导回 RDBMS。 2. **codegen**: `codegen` 命令允许将数据库表映射为 Java 类,生成的类...