“使用jq进行JSON处理”扩展教程

BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
2020年3月编辑 知识库
您可能希望在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提供了额外的功能,比如从表结构中提取可变长度的值数组(如标签),或者计算元素,正则表达式替换等。
标记:
Jasmine_ yyhuang

评论

  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    注意:似乎有问题使用扩展与免费版的RapidMiner。
    在付费/试用/教育中,可能需要在启动选项卡的首选项中设置“授予未签名扩展的额外权限”。
    Jasmine_ amnonkhen
  • pacogpacog 成员职位:2新手
    它目前有效吗?我总是有一个错误,而读取json文件或url:

    "执行jq脚本操作符在此进程中失败"

    只是使用了操作符"open file"和"read document"的默认值
  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    嗨!

    它可以在我的Studio 9.7.002中使用上述限制(授予额外权限…)。

    我使用的库正在做一些RapidMiner不喜欢的操作。

    如果扩展不适合您,您可以右键单击操作符“打开定义过程”,并将其用作具有宏参数化的子过程。您将从操作符参数中删除创建宏的前五个操作符,并在流程上下文中创建相同的宏。然后保存该进程,并通过使用Macros按钮指定参数在其他进程中使用它。

    问候,
    Balazs
  • pacogpacog 成员职位:2新手
    魔法! !不做任何事情,但重新启动几次快速矿工,现在它的工作!!我也有9.7.002版本。

    谢谢!
  • 圣 成员职位:15贡献我
    你好@BalazsBarany正如您在社区页面中提到的,在jq中使用流程文档。我尝试从sunprocess中删除前5个宏操作符,并添加到宏列表并运行该进程。jq脚本仍然无法运行java。朗的错误。请帮我完成这个过程。我试图通过给予json作为输入来处理文档并获得表中的结果,然后转换为json来实现文档相似性。
  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    你好,

    我对您的流程一无所知,也不知道错误信息。我需要更多的细节来帮助你。

    在此过程中,您定义的宏必须具有与删除的参数操作符中使用的名称完全相同的名称。如果可以的话,我们必须找出导致错误的原因。它可能是一个错误的JQ表达式(您可以在jqplay.com上检查),数据的问题,或脚本的问题。

    问候,
    Balazs
  • amnonkhenamnonkhen 成员职位:6贡献我
    你好,
    感谢本教程。
    有人能够解决发生在社区版的权限错误吗?
    我指的是导致这个错误信息的那个:
    'Process Document with jq'失败:给定的脚本违反了RapidMiner Studio的安全约束。
    谢谢,
    暗嫩Khen
  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    不幸的是(对于这个扩展,但幸运的是,对于整体情况),RapidMiner正在收紧在工作室执行的脚本的安全性。

    越来越多的客户在服务器或云中使用RapidMiner,在这些环境中,脚本可以允许没有很好定义的事情。

    您可以尝试在Settings => Start-up表单中设置“授予未签名扩展的额外权限”。如果这不起作用,您可以尝试将Studio降级到较旧的版本。

    我对这个扩展的测试过程在我的Studio 9.10.0中仍然有效,但不能保证这个扩展在未来的版本中仍然可用。在本机操作符中具有此功能会很酷,但这需要Java程序员,而我不是。

    问候,
    Balazs

  • amnonkhenamnonkhen 成员职位:6贡献我
    谢谢,Balazs。
    我甚至尝试写自己的脚本,但RM出于安全原因阻止了它。
    这很奇怪。这是我自己的代码,在我自己的电脑上运行。
    这将是很好的能够亲自批准这个特定的扩展在我的电脑上。
    亲切的问候,
    暗嫩
  • suzan_rsuzan_r 成员职位:1新手
    2021年12月编辑
    你好,Balazs,

    我有一个关于Jq函数的过程文档的问题。

    我想使用read一个Json文件,但由于某种原因,当我处理它时,我只得到文件的第一条消息。我比较了read document函数和Process document with iq函数后的结果,似乎只有1条消息通过。

    当我复制jqplay.org中的文件时,我确实得到了预期的结果。所以我不确定我做错了什么。

    当我从你的例子中使用Json文件时,它似乎工作得很好,所以这也很奇怪。

    亲切的问候
    苏珊


  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    嗨,苏珊,

    这很有趣。您是否可以添加更多细节,例如文件的示例内容和您正在使用的JQ表达式?

    jqplay.org使用原始的jq实用程序,但RapidMiner扩展使用Java重新实现,它们可能以微妙的方式工作。

    问候,

    Balazs
  • greyulvgreyulv 成员职位:1新手
    4月18日编辑
    @BalazsBarany需要帮助JSON处理与jq。

    需要帮助:jq表达式中的参数不能作为jqplay.org游乐场过滤器和结果

    在我简单的JSON数据:

    {
    “eventid”:“94 f707a8 - ddde - 46 - e2 - 99 - f1 - 3 - c83ca83499b”,
    “visitorid”:“01761 ba7286200062a2a96d59d1a03072013906a00bd0”
    }
    {
    :“eventid 4 b560bdf-de4b-45f1-a6c2-32cd8e68e2bc”,
    “visitorid”:“0172 dfb7b47f001ae614ab3b7c4801077001e06f0093c
    }




    只产生以下内容:

    如上所示,只显示第一个元素。另外,我们如何将键作为属性名呢?

    环境:Windows 64位,RM 9.10.001(教育版)

    <?xml version="1.0" encoding="UTF-8"?> <过程version = " 9.10.001”>
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文






    <过程扩展= " true " >



    < /操作符>





    < /操作符>




    < /操作符>



    < /操作符>














    <列出关键= "注释" / >




    <列出关键= " data_set_meta_data_information " / >

    < /操作符>








    > < /过程
    < /操作符>
    > < /过程






  • BalazsBaranyBalazsBarany 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家职位:796独角兽
    嗨!

    你的JSON结构实际上是不正确的,对象需要用逗号分隔。

    官方JQ对此相当宽容。

    扩展中使用的Java重新实现显然不是。
    您可能需要修复JSON。例如,将字符串中的“^\}$”替换为“\},$”,然后将[]放在它周围,从而产生正确的JSON数组结构。

    问候,
    Balazs
  • data123data123 成员职位:21Maven
    @suzan_r你能解决你报告的问题吗?我也有类似的问题。我只得到第一行的文件,但结果是预期的jq发挥。

    问候
    安东尼
登录注册置评。