使用 sqoop 和 hive 将分隔列值获取到不同的行中

Posted

技术标签:

【中文标题】使用 sqoop 和 hive 将分隔列值获取到不同的行中【英文标题】:Get delimited columns values into different rows using sqoop and hive 【发布时间】:2016-05-31 12:59:04 【问题描述】:

我的一个 oracle 数据库表中有以下数据 -

ZONE_ID,ZONE_NAME,OPERATORS,GEOGRAPHIES,PRODUCT_ID
3285,'EUROPE',null,'3,6,14,21,32',2
3293,'USA AND MEXICO',null,'133,215',3
3061,'Europe','11,238,352,398',null,4
3221,'USA','1079',null,5

在运算符和地理列中,数据以逗号分隔。对于每一行,数据要么存在于操作符列中,要么存在于地理列中。

我需要在单独的行中获取这些分隔数据,如下所示:

ZONE_ID,ZONE_NAME,OPERATORS,GEOGRAPHIES,PRODUCT_ID
3285,'EUROPE',null,3,2
3285,'EUROPE',null,6,2
3285,'EUROPE',null,14,2
3285,'EUROPE',null,21,2
3285,'EUROPE',null,32,2
3293,'USA AND MEXICO',null,133,3
3293,'USA AND MEXICO',null,215,3
3061,'Europe',11,null,4
3061,'Europe',238,null,4
3061,'Europe',352,null,4
3061,'Europe',398,null,4
3221,'USA',1079,null,5

在从 oracle db 导入 sqoop 期间是否可以进行这种转换?否则我们如何使用 sqoop 导入这些数据并在 hive 中进行此转换。

请帮忙。

【问题讨论】:

1. 将数据导入 HDFS 文本文件,但确保 Sqoop 使用另一个字段分隔符(请注意使用纯 ASCII 字符,例如 ;| ) 2. 在文本文件上创建 Hive“EXTERNAL”表,明确定义字段分隔符(为 Sqoop 设置的内容)和数组分隔符(逗号),并将 GEOGRAPHIES col 定义为类型 ARRAY 3. explode SELECT 中的数组 cf。 cwiki.apache.org/confluence/display/Hive/… @Samson Scharfrichter 我也在考虑同样的问题。但是需要同时展开 Operators 和 Geographies 列,因为它们都有分隔数据,根据对于每一行,数据要么存在于 Operators 列中,要么存在于 geographies 列中。爆炸如何同时在两列上工作?非常感谢。 explode 在多个列上将导致部分笛卡尔积;在您的情况下,这并不重要,因为您在两个列中都没有数据。在其他情况下,当您必须匹配 X[1] 和 Y[1]、X[2] 和 Y[2] 等时,您必须 posexplode 然后清除不匹配的记录(例如 X[1] 和Y[2]) 在另一个 WHERE 子句中——效率不高,但它有效。 @SamsonScharfrichter 我实际上有一个要求,即两列中都存在数据。我无法使用poseexplode解决它。请帮忙。如果我有这种方式的数据 - 3285,'EUROPE','133,215','3,6',2 。我需要这样 - 3285,'EUROPE','133',null,2 3285,'EUROPE','215',null,2 3285,'EUROPE',null,'3',2 3285,'EUROPE' ,null,'6',2 然后运行两个不同的查询,一个使用EXPLODE(operators) WHERE operators IS NOT NULL,另一个使用EXPLODE(geographies) WHERE geographies IS NOT NULL,然后UNION ALL在运行时合并结果。 【参考方案1】:

在 hive 中使用以下查询使其正常工作:

select ZONE_ID
,ZONE_NAME
,col1
,col2
,product_id
from table
lateral view explode(OPERATORS) ptable1 as col1
lateral view explode(GEOGRAPHIES) ptable2 as col2
;

【讨论】:

以上是关于使用 sqoop 和 hive 将分隔列值获取到不同的行中的主要内容,如果未能解决你的问题,请参考以下文章

利用sqoop从 hive中往mysql中导入表出现的问题

如何获取基于 HIVE-SQOOP 的批处理作业的异常、错误和日志?

Hive使用十六进制分隔符异常分析

0026-Hive使用十六进制分隔符异常分析

CCA175 的 Sqoop / Hive:获取表 AlreadyExistsException

第3节 sqoop:4sqoop的数据导入之导入数据到hdfs和导入数据到hive表