使用 Sqoop 导入时处理 Hive table 中的分区
Handle Partition in Hive table while using Sqoop import
我对 sqoop 导入实用程序有疑问。我知道我们可以 运行 a "sqoop import" 并从 RDBMS(在我的例子中是 SQL 服务器)获取数据并直接将其放入配置单元 table(将动态创建).
我的问题是如果必须的话,如何使用 "sqoop import" 实用程序在此配置单元 table 中创建分区(这可能吗?)。
"sqoop import to Hive" 完成后,我总是看到未分区的 Hive table。我的要求是在 x、y、z 列上有一个分区的 tables..
谢谢,
席德
您可以直接将数据导入到 hive table 并且可以创建分区 table 并使用 sqoop 直接加载它。
请找到以下代码:
sqoop import \
--connect "jdbc:sqlserver://yourservername:1433;databases=EMP" \
--connection-manager org.apache.sqoop.manager.SQLServerManager \
--username youruserid \
--password yourpassword \
--fields-terminated-by '|' \
--as-textfile \
--delete-target-dir \
--target-dir 'hdfspathlocation' \
--hive-import \
--hive-overwrite \
--hive-table UDB.EMPLOYEE_PARTITION_TABLE \
--hive-partition-key EMPLOYEE_CITY \
--hive-partition-value 'NOIDA' \
--num-mappers 1 \
--query "select TEST_EMP_ID,TEST_EMP_NAME,TEST_EMP_DEPARTMENT,TEST_EMP_SALARY,TEST_EMP_CITY FROM EMP.dbo.TEST_EMP_TABLE where TEST_EMP_CITY = 'NOIDA' AND $CONDITIONS";
如您所见,此 sqoop 导入将在配置单元中创建一个分区 table UDB.EMPLOYEE_PARTITION_TABLE 并创建一个分区列作为 EMPLOYEE_CITY.
这将在配置单元中创建一个托管的 table,其中包含文本格式的数据。
下面是配置单元的架构 table:
+--------------------------+-----------------------+-----------------------+--+
| col_name | data_type | comment |
+--------------------------+-----------------------+-----------------------+--+
| test_emp_id | int | |
| test_emp_name | string | |
| test_emp_department | string | |
| test_emp_salary | int | |
| test_emp_city | string | |
| employee_city | string | |
| | NULL | NULL |
| # Partition Information | NULL | NULL |
| # col_name | data_type | comment |
| | NULL | NULL |
| employee_city | string | |
+--------------------------+-----------------------+-----------------------+--+
0 2018-11-30 00:01 /hdfspathlocation/udb.db/employee_partition_table/employee_city=NOIDA
您需要确认几件事。
当您使用 hive-import 时,您的 hive-partition-key 列名称不应是数据库的一部分 table。否则你会得到以下错误。
Imported Failed: Partition key TEST_EMP_CITY cannot be a column to import.
在 sqoop 导入中指定查询时,将分区列保留在 select 语句的末尾。
select TEST_EMP_ID,TEST_EMP_NAME,TEST_EMP_DEPARTMENT,TEST_EMP_SALARY,TEST_EMP_CITY FROM EMP.dbo.TEST_EMP_TABLE where TEST_EMP_CITY = 'NOIDA' AND $CONDITIONS
让我知道这是否适合你。
我对 sqoop 导入实用程序有疑问。我知道我们可以 运行 a "sqoop import" 并从 RDBMS(在我的例子中是 SQL 服务器)获取数据并直接将其放入配置单元 table(将动态创建).
我的问题是如果必须的话,如何使用 "sqoop import" 实用程序在此配置单元 table 中创建分区(这可能吗?)。
"sqoop import to Hive" 完成后,我总是看到未分区的 Hive table。我的要求是在 x、y、z 列上有一个分区的 tables..
谢谢, 席德
您可以直接将数据导入到 hive table 并且可以创建分区 table 并使用 sqoop 直接加载它。 请找到以下代码:
sqoop import \
--connect "jdbc:sqlserver://yourservername:1433;databases=EMP" \
--connection-manager org.apache.sqoop.manager.SQLServerManager \
--username youruserid \
--password yourpassword \
--fields-terminated-by '|' \
--as-textfile \
--delete-target-dir \
--target-dir 'hdfspathlocation' \
--hive-import \
--hive-overwrite \
--hive-table UDB.EMPLOYEE_PARTITION_TABLE \
--hive-partition-key EMPLOYEE_CITY \
--hive-partition-value 'NOIDA' \
--num-mappers 1 \
--query "select TEST_EMP_ID,TEST_EMP_NAME,TEST_EMP_DEPARTMENT,TEST_EMP_SALARY,TEST_EMP_CITY FROM EMP.dbo.TEST_EMP_TABLE where TEST_EMP_CITY = 'NOIDA' AND $CONDITIONS";
如您所见,此 sqoop 导入将在配置单元中创建一个分区 table UDB.EMPLOYEE_PARTITION_TABLE 并创建一个分区列作为 EMPLOYEE_CITY.
这将在配置单元中创建一个托管的 table,其中包含文本格式的数据。 下面是配置单元的架构 table:
+--------------------------+-----------------------+-----------------------+--+
| col_name | data_type | comment |
+--------------------------+-----------------------+-----------------------+--+
| test_emp_id | int | |
| test_emp_name | string | |
| test_emp_department | string | |
| test_emp_salary | int | |
| test_emp_city | string | |
| employee_city | string | |
| | NULL | NULL |
| # Partition Information | NULL | NULL |
| # col_name | data_type | comment |
| | NULL | NULL |
| employee_city | string | |
+--------------------------+-----------------------+-----------------------+--+
0 2018-11-30 00:01 /hdfspathlocation/udb.db/employee_partition_table/employee_city=NOIDA
您需要确认几件事。 当您使用 hive-import 时,您的 hive-partition-key 列名称不应是数据库的一部分 table。否则你会得到以下错误。
Imported Failed: Partition key TEST_EMP_CITY cannot be a column to import.
在 sqoop 导入中指定查询时,将分区列保留在 select 语句的末尾。
select TEST_EMP_ID,TEST_EMP_NAME,TEST_EMP_DEPARTMENT,TEST_EMP_SALARY,TEST_EMP_CITY FROM EMP.dbo.TEST_EMP_TABLE where TEST_EMP_CITY = 'NOIDA' AND $CONDITIONS
让我知道这是否适合你。