“使用jq进行JSON处理”扩展教程
BalazsBarany
管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
您可能希望在RapidMiner中处理一些复杂的JSON文档。控件的功能使用jq处理JSON扩展。
第一步是从市场安装扩展,如果你还没有它。单击Extensions/Marketplace菜单项,在Marketplace窗口中,在搜索框中输入JSON。选择要安装的扩展,并在安装完成后让Studio重新启动自己。
让我们用一个公开的数据集维也纳开放数据服务器。
以下是维也纳市的游乐场列表,其中包含一些属性和地理坐标:
https://www.data.gv.at/katalog/dataset/bd8b518b-d812-46f9-b367-4c1b660cfc99
当你去到那里,你会看到一个不同格式的文档列表,我们显然对JSON文档感兴趣这个URL.
获取该URL的内容并使用jq处理它们的最简单的RapidMiner过程如下:
在Open File中,将资源类型设置为URL,并粘贴JSON资源的URL。在读取文档中取消选中“只提取文本”,因为我们不想改变输入。然后添加一个带有jq操作符的Process Document,并连接其输入和输出端口。
默认情况下,为JSON输出设置了带有jq的Process Document,缩进(格式化)结果JSON文档,并使用最简单的jq表达式“。”,该表达式只是复制(并格式化)传入文档。
所以我们从这个过程中得到第一个结果:
该文档包含一种标题(类型:来自GeoJSON标准的featurecall和totalFeatures)和一组“功能”(操场)。
我们感兴趣的是名称(ANL_NAME)、运动场细节(SPIELPLATZ_DETAIL)和每个运动场的地理坐标。
要开发jq表达式,我们转到jqplay.org并将JSON数据粘贴到JSON字段。我们开始交互式地开发表达式来选择我们想要的数据。
第一步是“。features”。这将选择特征数组(丢弃标题),并将每个元素作为一个大数组的对象返回。
如果我们把它改成"。“Features[]”,我们得到一个不同对象的列表,这有利于进一步的处理。
在jq中,我们使用管道符号|来处理步骤。现在我们在管道后面列出需要的元素。表达式是:
.features[] | [.properties. properties]ANL_NAME . properties。SPIELPLATZ_DETAIL .geometry。.geometry坐标[0]。坐标[1]]
这为我们提供了一个很好的平面结构,我们可以很容易地使用RapidMiner处理它,特别是如果我们让操作符将其转换为CSV。
(在Read CSV操作符中取消选中“第一行作为名称”,并将分隔符更改为逗号。)
结果是一个正常的RapidMiner示例集:
如果需要处理更复杂的文档,请查看jq的文档。Jq提供了额外的功能,比如从表结构中提取可变长度的值数组(如标签),或者计算元素,正则表达式替换等。
第一步是从市场安装扩展,如果你还没有它。单击Extensions/Marketplace菜单项,在Marketplace窗口中,在搜索框中输入JSON。选择要安装的扩展,并在安装完成后让Studio重新启动自己。
让我们用一个公开的数据集维也纳开放数据服务器。
以下是维也纳市的游乐场列表,其中包含一些属性和地理坐标:
https://www.data.gv.at/katalog/dataset/bd8b518b-d812-46f9-b367-4c1b660cfc99
当你去到那里,你会看到一个不同格式的文档列表,我们显然对JSON文档感兴趣这个URL.
获取该URL的内容并使用jq处理它们的最简单的RapidMiner过程如下:
在Open File中,将资源类型设置为URL,并粘贴JSON资源的URL。在读取文档中取消选中“只提取文本”,因为我们不想改变输入。然后添加一个带有jq操作符的Process Document,并连接其输入和输出端口。
默认情况下,为JSON输出设置了带有jq的Process Document,缩进(格式化)结果JSON文档,并使用最简单的jq表达式“。”,该表达式只是复制(并格式化)传入文档。
所以我们从这个过程中得到第一个结果:
该文档包含一种标题(类型:来自GeoJSON标准的featurecall和totalFeatures)和一组“功能”(操场)。
我们感兴趣的是名称(ANL_NAME)、运动场细节(SPIELPLATZ_DETAIL)和每个运动场的地理坐标。
要开发jq表达式,我们转到jqplay.org并将JSON数据粘贴到JSON字段。我们开始交互式地开发表达式来选择我们想要的数据。
第一步是“。features”。这将选择特征数组(丢弃标题),并将每个元素作为一个大数组的对象返回。
如果我们把它改成"。“Features[]”,我们得到一个不同对象的列表,这有利于进一步的处理。
在jq中,我们使用管道符号|来处理步骤。现在我们在管道后面列出需要的元素。表达式是:
.features[] | [.properties. properties]ANL_NAME . properties。SPIELPLATZ_DETAIL .geometry。.geometry坐标[0]。坐标[1]]
这为我们提供了一个很好的平面结构,我们可以很容易地使用RapidMiner处理它,特别是如果我们让操作符将其转换为CSV。
(在Read CSV操作符中取消选中“第一行作为名称”,并将分隔符更改为逗号。)
结果是一个正常的RapidMiner示例集:
如果需要处理更复杂的文档,请查看jq的文档。Jq提供了额外的功能,比如从表结构中提取可变长度的值数组(如标签),或者计算元素,正则表达式替换等。
2
评论
在付费/试用/教育中,可能需要在启动选项卡的首选项中设置“授予未签名扩展的额外权限”。
只是使用了操作符"open file"和"read document"的默认值
它可以在我的Studio 9.7.002中使用上述限制(授予额外权限…)。
我使用的库正在做一些RapidMiner不喜欢的操作。
如果扩展不适合您,您可以右键单击操作符“打开定义过程”,并将其用作具有宏参数化的子过程。您将从操作符参数中删除创建宏的前五个操作符,并在流程上下文中创建相同的宏。然后保存该进程,并通过使用Macros按钮指定参数在其他进程中使用它。
问候,
Balazs
谢谢!
我对您的流程一无所知,也不知道错误信息。我需要更多的细节来帮助你。
在此过程中,您定义的宏必须具有与删除的参数操作符中使用的名称完全相同的名称。如果可以的话,我们必须找出导致错误的原因。它可能是一个错误的JQ表达式(您可以在jqplay.com上检查),数据的问题,或脚本的问题。
问候,
Balazs
感谢本教程。
有人能够解决发生在社区版的权限错误吗?
我指的是导致这个错误信息的那个:
谢谢,
暗嫩Khen
越来越多的客户在服务器或云中使用RapidMiner,在这些环境中,脚本可以允许没有很好定义的事情。
您可以尝试在Settings => Start-up表单中设置“授予未签名扩展的额外权限”。如果这不起作用,您可以尝试将Studio降级到较旧的版本。
我对这个扩展的测试过程在我的Studio 9.10.0中仍然有效,但不能保证这个扩展在未来的版本中仍然可用。在本机操作符中具有此功能会很酷,但这需要Java程序员,而我不是。
问候,
Balazs
我甚至尝试写自己的脚本,但RM出于安全原因阻止了它。
这很奇怪。这是我自己的代码,在我自己的电脑上运行。
这将是很好的能够亲自批准这个特定的扩展在我的电脑上。
亲切的问候,
暗嫩
我有一个关于Jq函数的过程文档的问题。
我想使用read一个Json文件,但由于某种原因,当我处理它时,我只得到文件的第一条消息。我比较了read document函数和Process document with iq函数后的结果,似乎只有1条消息通过。
当我复制jqplay.org中的文件时,我确实得到了预期的结果。所以我不确定我做错了什么。
当我从你的例子中使用Json文件时,它似乎工作得很好,所以这也很奇怪。
亲切的问候
苏珊
这很有趣。您是否可以添加更多细节,例如文件的示例内容和您正在使用的JQ表达式?
jqplay.org使用原始的jq实用程序,但RapidMiner扩展使用Java重新实现,它们可能以微妙的方式工作。
问候,
Balazs
“eventid”:“94 f707a8 - ddde - 46 - e2 - 99 - f1 - 3 - c83ca83499b”,
“visitorid”:“01761 ba7286200062a2a96d59d1a03072013906a00bd0”
}
{
:“eventid 4 b560bdf-de4b-45f1-a6c2-32cd8e68e2bc”,
“visitorid”:“0172 dfb7b47f001ae614ab3b7c4801077001e06f0093c
}
> <上下文
<输入/ >
<输出/ >
<宏/ >
> < /上下文
<过程扩展= " true " >
< /操作符>
< /操作符>
< /操作符>
< /操作符>
<列出关键= "注释" / >
<列出关键= " data_set_meta_data_information " / >
< /操作符>
> < /过程
< /操作符>
> < /过程
你的JSON结构实际上是不正确的,对象需要用逗号分隔。
官方JQ对此相当宽容。
扩展中使用的Java重新实现显然不是。
您可能需要修复JSON。例如,将字符串中的“^\}$”替换为“\},$”,然后将[]放在它周围,从而产生正确的JSON数组结构。
问候,
Balazs
问候
安东尼