从字符串中提取键值对

时间:2019-09-01 14:18:10

标签: hive hiveql key-value

我是Hive的新手,它尝试运行查询,其中列import React from 'react'; function feed (props) { function openPopup(){ //code relevant to open popup } return ( <div className="card-header"> <h2>{props.firstname} {props.middleInitial} {props.lastname}</h2> <h4 className="card-title">{props.gender}</h4> </div> <div className="card-footer"> <button onClick={openPopup} className="btn btn-secondary">Click To view Samples</button> </div> ); } export default feed; 中的一列被描述为类型字符串,并且包含诸如(col1)之类的键值对。我试图提取一些值,所以我可以做一些事情,例如返回col1包含color = blue的所有行。

我一直在尝试使用{color=blue, name=john, size=M},但是我不认为这是正确的方法,因为我不确定该字段在技术上是否是json数组。

2 个答案:

答案 0 :(得分:1)

使用与Hive兼容的SPARK SQL。

如果col1是字符串,这可以是一个解决方案:

val initDF = spark.sql("select '{color=blue, name=john, size=M}' as col1 union select '{color=red, name=jim, size=L}' as col1")
initDF.show(false)

它显示:

+-------------------------------+
|col1                           |
+-------------------------------+
|{color=blue, name=john, size=M}|
|{color=red, name=jim, size=L}  |
+-------------------------------+

如果只想获取其中color = blue的行

initDF.where("col1 like '%color=blue%'").show(false)

哪个显示了预期的结果:

+-------------------------------+
|col1                           |
+-------------------------------+
|{color=blue, name=john, size=M}|
+-------------------------------+

如果col1是一个结构:

val initDFStruct = spark.sql("select 'blue' as color, 'john' as name, 'M' as size union select 'red' as color, 'jim' as name, 'L'")
  .selectExpr("(color, name, size) as col1")
initDFStruct.show(false)

它显示:

+---------------+
|col1           |
+---------------+
|[red, jim, L]  |
|[blue, john, M]|
+---------------+

initDFStruct.where("col1.color = 'blue'").show(false)

哪个显示了想要的结果:

+---------------+
|col1           |
+---------------+
|[blue, john, M]|
+---------------+

总而言之,如果将其作为字符串列,则可以在where子句中使用 where col1 like '%color=blue%' 而如果将其作为结构,则where子句应为: "col1.color = 'blue'

答案 1 :(得分:0)

您可以将字符串转换为map(使用逗号删除大括号和空格,并使用str_to_map函数)。蜂巢示例:

with your_data as 
(
select '{color=blue, name=john, size=M}' str
)

select str        as original_string,
       m['color'] as color,
       m['name']  as name,
       m['size']  as size
from
(
select str, str_to_map(regexp_replace(regexp_replace(str,'\\{|\\}',''),', *',','),',','=') m 
  from your_data --use your table
)s; 

结果:

original_string                 color   name    size    
{color=blue, name=john, size=M} blue    john    M