从字符串中提取键值对 [英] Extracting key value pair from string

查看:21
本文介绍了从字符串中提取键值对的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不熟悉配置单元,正在尝试运行一个查询,其中一列(col1)被描述为类型字符串,并包含诸如{color=blue, name=john, size=M}这样的键值对。我正在尝试提取一些值,以便可以执行类似于返回col1包含COLOR=BLUE的所有行的操作。

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

推荐答案

使用与配置单元兼容的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'

这篇关于从字符串中提取键值对的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆