【问题标题】:Extracting key value pair from string从字符串中提取键值对
【发布时间】:2020-01-04 21:20:18
【问题描述】:

我是 Hive 的新手,并尝试运行一个查询,其中 (col1) 列之一被描述为类型字符串并包含键值对,例如 {color=blue, name=john, size=M}。我正在尝试提取一些值,以便我可以执行类似返回 col1 包含 color=blue 的所有行之类的操作。

我一直在尝试使用 get_json_object,但我认为这不是正确的方法,因为我不确定该字段在技术上是一个 json 数组。

【问题讨论】:

标签: hive hiveql key-value


【解决方案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'

【讨论】:

    【解决方案2】:

    您可以将字符串转换为映射(删除逗号后的大括号和空格并使用 str_to_map 函数)。 Hive 示例:

    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   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2016-12-08
      • 2014-04-17
      • 2017-02-10
      • 1970-01-01
      相关资源
      最近更新 更多