本文介绍了从字符串中提取键值对的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我不熟悉配置单元,正在尝试运行一个查询,其中一列(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'
这篇关于从字符串中提取键值对的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!