Hive 查询以拆分列数据并存储到多个记录中

Posted

技术标签:

【中文标题】Hive 查询以拆分列数据并存储到多个记录中【英文标题】:Hive query to split column data and store into multiple records 【发布时间】:2018-02-15 15:29:39 【问题描述】:

有人可以建议我如何使用以下详细信息编写 Hive SQL 查询。

输入:(制表符分隔的数据)

Name Phone Address abc 123:456:789 hyderabad,bangalore,chennai xyz 111:222:333 delhi,mumbai,pune pqr 321:654:999 add1,add2,add3

输出:

Name Phone Address abc 123 hyderabad abc 456 bangalore abc 789 chennai xyz 111 delhi xyz 222 mumbai xyz 333 pune pqr 321 add1 pqr 654 add2 pqr 999 add3

谁能帮助我如何拆分列数据并将其放置为新记录不使用任何默认函数。 提前致谢。

【问题讨论】:

可能与此重复:***.com/questions/20667473/… 【参考方案1】:

使用posexplode,split。由于您需要拆分列的索引来匹配,因此您需要使用poseexplode创建索引并确保在将列转换为行时它们匹配。

select Name, Phone, Address 
from table 
      lateral view posexplode(split(Phone,':')) Phone AS index1, Phone
      lateral view posexplode(split(Address,',')) Address AS index2, Address
where index1=index2;

【讨论】:

【参考方案2】:

如果我们不知道用于此的预定义函数。我们可以编写如下自定义逻辑(仅当我们知道分隔符和#of splits)。

select name, substr(phone,instr(phone,':',1)-1) phone, substr(address,instr(address,',',1)-1)
union all 
select name, substr(phone,instr(phone,':',2)-1) phone, substr(address,instr(address,',',2)-1)
union all 
select name, substr(phone,instr(phone,':',2)+1,length(phone)) phone, substr(address,instr(address,',',2)+1,length(address))

如果我们不知道预定义的方法,这可能会有所帮助。

【讨论】:

以上是关于Hive 查询以拆分列数据并存储到多个记录中的主要内容,如果未能解决你的问题,请参考以下文章

记录大数据以使用 Hadoop 组织和存储它并使用 Hive 查询它的正确方法是啥?

Hive Query 在 Select 中具有多列并按一列分组

Hive查询:匹配列数组的字符串值以生成标志

Hive SQL 多个左外连接查询在其结果中缺少记录

用于从 Hive 中获取单个表的最大值、最小值和其他列的相应值以及总记录数的数据库查询

如何查询多个表以获取表具有相同列名的记录