您甚至可以看到业务分析师如何使用电子表格样式的工具来可视化查询结果。
处理大数据常常需要查询该数据,以隔离关注的信息,并以不同的方式对其进行操作。本文将向您介绍 Jaql,这是一个随 InfoSphere BigInsights 一起提供的查询和脚本语言。本文还讨论了如何查询从社交媒体站点中收集的数据,并将这些数据与从关系数据库管理系统 (DBMS) 中检索到的信息进行联接。
背景知识
也许您不熟悉 InfoSphere BigInsights,它是一个软件平台,旨在帮助企业发现和分析隐藏在不同范围的大量数据中的业务洞察,这些数据经常被忽略或丢弃,因为使用传统的手段来处理它们过于不切实际或困难。这样的数据包括日志记录、点击流、社交媒体数据、新闻提要、电子传感器输出,甚至是一些事务数据。
为了帮助企业以高效的方式从这些数据中获取价值,BigInsights 的 Enterprise Edition 提供了几个开源项目(包括 Apache Hadoop)和一些 IBM 开发的技术。Hadoop 和补充项目为数据密集型应用程序提供了有效的软件框架,利用分布式计算环境实现高可扩展性。IBM 技术通过分析软件、企业软件集成、平台扩展和工具丰富了这个开源框架。
本文向您介绍 BigInsights 通过 Jaql 提供的一些基本查询功能,Jaql 是一种查询和脚本语言,它使用基于 JavaScript Object Notation (JSON) 的数据模型。虽然 Jaql 并不是查询由 BigInsights Basic 或 Enterprise Editions 管理的数据的惟一方式(例如,您可以使用 Hive 或 Pig),但它能够与不同的数据结构(包括深层嵌套的数据结构)良好地进行配合。BigInsights 还提供了一个 Jaql 模块,可用于访问支持 JDBC 功能的数据源。这种功能对于我们的场景特别有用,其中涉及分析被收集为 JSON 记录的少量社交媒体数据,使用 Jaql 的 JDBC 模块,将该数据与从关系型 DBMS 中提取的 CSV(逗号分隔值)格式的企业记录相结合。
理解示例场景
在本文中,您将使用 Jaql 从社交媒体站点中搜集有关 IBM Watson 的文章,然后调用各种 Jaql 表达式来筛选、转换和操作这些数据。如果您不熟悉 IBM Watson,可以先简单介绍一下,这是一个研究项目,执行复杂的分析,解答使用自然语言提出的问题。为了做到这一点,Watson 的软件使用了在 IBM Power 750 服务器集群上运行的 Apache Hadoop,高效地处理从各种来源收集的数据。在 2011 年,IBM Watson 在电视转播的 Jeopardy! 游戏节目比赛中获得了第一,击败两个领先的人类参赛者。
很多企业的业务分析师都对监视某个特定品牌或服务的知名度、覆盖范围和议论感兴趣,因此,在本文中,IBM Watson 将作为这样一个品牌的示例。参考资料 部分中引用了之前的一篇文章,其中探讨了业务分析师如何使用 BigSheets(BigInsights 提供的电子表格风格的工具)分析从多个站点中收集到的有关 IBM Watson 的社交媒体数据。在本文中,您会收集和处理来自某个站点 (Twitter) 的小数据集,让您可以重点学习 Jaql 的关键方面。
值得一提的是,许多社交媒体站点都提供了 API,程序员可以用它来获取公共数据。在本文中,您将使用 Twitter 的基于 REST 的 API 来检索少量数据,其中包含您关注的最新推文。某生产应用程序可能会使用其他 Twitter 服务来获得大量数据,但是,由于本文的讨论重点是 Jaql,所以数据的收集工作会尽量保持简单。
通常情况下,社会媒体站点所提供的 API 会以 JSON 格式返回数据,Jaql 基于相同的数据模型。在深入探讨 Jaql 示例之前,您需要熟悉社交媒体数据的 JSON 结构,因为您会在本文中用到它。您可以轻松地做到这一点,只需在可以处理 JSON 数据的 Web 浏览器(如 Chrome)中输入下面的 URL:http://search.twitter.com/search.json?q=IBM+Watson。
这使 Twitter 返回匹配您的搜索条件 ("IBM Watson") 的 15 篇最新的文章。虽然根据执行搜索的时间不同,返回的内容页会有所不同,但结果的结构将类似于 清单 1 中的摘录,其中包括为了进行说明而创建的示例数据。很快,您就可以浏览该摘录的一些关键部分,为本文的测试提供相应的上下文。
清单 1. 来自基于 Twitter 的搜索的示例 JSON 记录结构
{ "completed_in": 0.021, "max_id": 99999999111111, "max_id_str": "99999999111111", "next_page": "?page=2&max_id=99999999111111&q=IBM%20Watson", "page": 1, "query": "IBM+Watson", "refresh_url": "?since_id=99999999111111&q=IBM%20Watson", "results": [ { "created_at": "Mon, 30 Apr 2012 18:42:37 +0000", "from_user": "SomeSampleUser", "from_user_id": 444455555, "from_user_id_str": "444455555", "from_user_name": "Some Sample User", "geo": null, "id": 000000000000000001, "id_str": "000000000000000001", "iso_language_code": "en", "metadata": { "result_type": "recent" }, "profile_image_url": "http://a0.twimg.com/profile_images/222222/TwitterPic2_normal.jpg", "profile_image_url_https": "https://si0.twimg.com/profile_images/222222/TwitterPic2_normal.jpg", "source": "<a href="http://news.myUniv.edu/" rel="nofollow">MyUnivNewsApp</a>", "text": "RT @MyUnivNews: IBM's Watson Inventor will present at a conference April 12 http://confURL.co/xrr5rBeJG", "to_user": null, "to_user_id": null, "to_user_id_str": null, "to_user_name": null }, { "created_at": "Mon, 30 Apr 2012 17:31:13 +0000", "from_user": "anotheruser", "from_user_id": 76666993, "from_user_id_str": "76666993", "from_user_name": "Chris", "geo": null, "id": 66666536505281, "id_str": "66666536505281", "iso_language_code": "en", "metadata": { "result_type": "recent" }, "profile_image_url": "http://a0.twimg.com/profile_images/3331788339/Mug_Shot.jpg", "profile_image_url_https": "https://si0.twimg.com/profile_images/3331788339/Mug_Shot.jpg", "source": "<a href="http://www.somesuite.com" rel="nofollow">SomeSuite</a>", "text": "IBM's Watson training to help diagnose and treat cancer http://someURL.co/fBJNaQE6", "to_user": null, "to_user_id": null, "to_user_id_str": null, "to_user_name": null},. . . "results_per_page": 15,"since_id": 0,"since_id_str": "0"}
以下是对 JSON 的一个非常简短的介绍。清单 1 中包含一个 JSON 记录,其开头和结尾都用花括号 “{ }” 指出。在此记录中,有多个名称/值对、其他(嵌套) JSON 记录,和 JSON 数组(以方括号 “[]” 界定)。这是典型的 JSON,其中已包含大量嵌套的和不同的数据结构。
在本示例中,您可以看到,JSON 记录的初始部分包含名称/值对,以及有关 Twitter 搜索的背景信息。例如,搜索在 0.021 秒内完成,并且查询涉及到了 IBM Watson。记录中嵌套的 “results” 数组包含本文最关注的数据:包含有关 IBM Watson 的推文的其他 JSON 记录。
在结果数组中嵌套的每一个 JSON 记录都指示了用来让大家了解用户的名称 ("from_user_name")、创建消息的时间戳 ("created_at")、消息文本 ("text")、文本的语言 “iso_language_code”,等等。事实上,您会使用用户的 ID ("from_user_id_str") 来联接社交媒体数据与从关系型 DBMS 中提取的数据。本文的联接场景很简单,甚至有点取巧。它假定:雇主维护一个关系表,跟踪其员工用于公务的社交媒体 ID,该企业希望分析最近的文章。不过,可以将使用 Jaql 联接来自不同数据源的数据的基本方法应用于更广泛的场景。