使用Apache Drill对混合模式数据进行SQL查询

您可能已经听过以下声明:

Apache Drill可以即时进行模式发现。

这是什么意思,为什么对您来说很重要?

SQL具有强大的业务分析功能,但是大数据设置中的挑战在于,SQL通常是一种静态语言,采用预定义,固定和众所周知的模式。 SQL还需要平面数据结构。 已经假定您需要固定的架构才能提高性能。 相反,在大数据领域中工作需要灵活而动态。 您将遇到各种各样的数据类型,包括非结构化和半结构化数据以及嵌套的JSON和Parquet; 这些数据格式不适用于传统方法。

为了在传统数据库上使用SQL查询这些数据类(AKA数据建模)而转换这些类数据所需的工作通常在实用上使这些数据源超出了限制。 这就是开放源代码Apache Drill的创新性设计的发源地。使用标准的ANSI SQL语法,Drill可以轻松地处理各种大数据源和格式,而无需进行大量昂贵的ETL处理。 Drill通过使用JSON数据模型进行交互,以现有数据类型浏览和查询数据。

在圣何塞的Strata + Hadoop World会议上,题为“及时优化”的演讲中,MapR的首席应用程序设计师Ted Dunning讨论了这个问题以及Drill如何解决它。 Ted解释说,Drill“将大部分优化和类型特殊性从查询解析和静态优化过程移到了执行过程本身中”,并且这样做无需事先了解太多架构。 此外,Drill可以通过更改架构优化跨数据集的查询。 对于大数据而言,处理具有多个模式的数据非常重要,因为即使数据在第1天以定义良好的模式开始,通常也不会很快更改该模式。 结果是传统SQL引擎无法直接处理数据。 Ted强调了这一点,他说:“ Drill将SQL的复杂性和熟悉度与Hadoop生态系统的灵活性结合在一起。”

示例:跨混合模式数据的Apache Drill SQL查询

Drill即时发现架构元数据的能力具有实际优势。 假设在零售情况下,您有一张桌子,六个月前在其中添加了用于新生产的新列。 您想使用单个查询跨旧数据(缺少列)和新数据(具有列)进行查询。 Drill可以执行此操作,因为架构突变是核心功能。

我向系统工程师Chris Matta询问了他在使用Drill解决类似问题的MapR客户方面的经验。 他的回答是:“当然,它一直在发生。 当Drill遍历一个未包含在所有结果中的新字段时,请将没有该列的数据中的字段设置为NULL。 这就是使Drill在实际使用中如此强大的原因,并且避免了必须维护架构和执行ETL才能使数据“合适”的情况。” 克里斯继续解释说,Drill适用于所有基础存储插件(如果您要加入,则适用于所有插件)。

这让我想到显示如何查询具有不同架构的两个数据集可能是有趣且有用的。

在其中,您知道个人的名称,公司和头衔。 稍后,您发现其中一些人具有超级英雄的秘密身份,因此您添加了一个列,用于标识要添加的新案件。 使用传统方法,这种混合模式数据将难以查询。 但是使用Drill,您只需将查询指向新旧数据即可。

请注意在以下三种情况下会发生什么:

  1. 一起查询旧数据集和新数据集:在新数据集中添加了新列,但Drill仍可以使用一个查询来查询旧数据和新数据。
    注意:现在,在存在可变模式的情况下如何处理select* 。 效果可能不是您想要的。
  2. 掩饰:某些人有一个秘密身份,因此您可能想掩饰其真实姓名。 这可以通过仍然对新旧数据进行查询设计来完成。 如果此人是具有秘密身份的超级英雄,则用户将看到“ -secret-”(秘密)而不是姓名,这可以保护他们的掩盖。
  3. 用于屏蔽的Apache Drill视图: Drill视图具有链式模拟。 如果您的背景是标准SQL,这并不奇怪,但是像Hive或Impala这样的类似SQL的工具的用户可能会感到惊讶。 另请参阅“ 安全共享大数据”的第3章

外观如下(感谢Ted Dunning和Chris Matta提供的示例帮助):

请记住,文件可以视为表。 通常,我们会以一种方式收集数据,然后再以新格式收集更多数据。 这里有两个文件, old.jsonnew.json 。 使用Drill,我们可以像查询表一样查询它们。 我们必须使用访问文件系统中找到的数据的数据源 ,并且必须将路径名放在反引号内,以避免Drill将路径名视为某种SQL表达式或保留字。

0: jdbc:drill:> select * from maprfs.ted.`json/old.json`;
+---------------+-------------------+-------------------+--------------+
|       name    |       company     |       title       |       city   |
+---------------+-------------------+-------------------+--------------+
| Tony Stark    | Stark Industries  | Engineer; ex-CEO  | Malibu       |
| Pepper Potts  | Stark Industries  | CEO               | Los Angeles  |
| JARVIS        | Stark household   | Assistant         | Malibu       |
+---------------+-------------------+-------------------+--------------+
3 rows selected (0.369 seconds)
0: jdbc:drill:> select * from maprfs.ted.`json/new.json`;
+---------------+------------+--------------------+-----------------+--------------+
|       name    |  identity  |      company       |       title     |    city      |
+---------------+------------+--------------------+-----------------+--------------+
| Clark Kent    | Superman   | Daily Planet       | Reporter        | Metropolis   |
| Lois Lane     | null       | Daily Planet       | Reporter        | Metropolis   |
| Peter Parker  | Spiderman  | Empire State Univ  | Student         | New York     |
| Bruce Wayne   | Batman     | Wayne Enterprises  | Philanthropist  | Gotham City  |
+---------------+------------+--------------------+-----------------+--------------+
4 rows selected (0.344 seconds)

请注意,新数据有一个额外的列。

查询旧数据集和新数据集:多个文件作为一个表

我们还可以查询整个目录,就好像它是一个表一样。 这将隐式查询所有文件。 请注意,组合表仅具有两个文件之间共有的列。

0: jdbc:drill:> select * from maprfs.ted.`json`;
+---------------+--------------------+-------------------+--------------+
|       name    |     company        |       title       |       city   |
+---------------+--------------------+-------------------+--------------+
| Tony Stark    | Stark Industries   | Engineer; ex-CEO  | Malibu       |
| Pepper Potts  | Stark Industries   | CEO               | Los Angeles  |
| JARVIS        | Stark household    | Assistant         | Malibu       |
| Clark Kent    | Daily Planet       | Reporter          | Metropolis   |
| Lois Lane     | Daily Planet       | Reporter          | Metropolis   |
| Peter Parker  | Empire State Univ  | Student           | New York     |
| Bruce Wayne   | Wayne Enterprises  | Philanthropist    | Gotham City  |
+---------------+--------------------+-------------------+--------------+
7 rows selected (0.368 seconds)

如果我们要求,可以通过明确提及身份列来包括它。 同样,我们需要反引号,但这次是因为身份是SQL中的保留字,但我们希望将其视为字段名。

0: jdbc:drill:> select name, company, `identity`, title, city from maprfs.ted.`json/*` ;
+---------------+--------------------+------------+-------------------+--------------+
|       name    |     company        |  identity  |          title    |     city     |
+---------------+--------------------+------------+-------------------+--------------+
| Tony Stark    | Stark Industries   | null       | Engineer; ex-CEO  | Malibu       |
| Pepper Potts  | Stark Industries   | null       | CEO               | Los Angeles  |
| JARVIS        | Stark household    | null       | Assistant         | Malibu       |
| Clark Kent    | Daily Planet       | Superman   | Reporter          | Metropolis   |
| Lois Lane     | Daily Planet       | null       | Reporter          | Metropolis   |
| Peter Parker  | Empire State Univ  | Spiderman  | Student           | New York     |
| Bruce Wayne   | Wayne Enterprises  | Batman     | Philanthropist    | Gotham City  |
+---------------+--------------------+------------+-------------------+--------------+
7 rows selected (0.304 seconds)

掩蔽

我们甚至可以使用一些奇特的SQL来隐藏任何已知是超级英雄的人的身份。 旧文件中的任何人都不会知道超级英雄身份,因为那时还没有记录。 在新文件中,任何已知是超级英雄的人都可以隐藏其名称。 路易斯·莱恩(Lois Lane)没有超级英雄身份(在此表中,即忽略了DC替代宇宙的复杂性),因此即使在新数据中提到了她,她的名字也不会被屏蔽。

0: jdbc:drill:> select
. . . . . . . >    case
. . . . . . . >    when `identity` is null then name
. . . . . . . >    else ' -- secret --'
. . . . . . . >    end
. . . . . . . >    as name,
. . . . . . . >    company,
. . . . . . . >    `identity`,
. . . . . . . >    title,
. . . . . . . >    city
. . . . . . . > from maprfs.ted.`json`;
+----------------+--------------------+------------+-------------------+--------------+
|       name     |     company        |  identity  |      title        |     city     |
+----------------+--------------------+------------+-------------------+--------------+
| Tony Stark     | Stark Industries   | null       | Engineer; ex-CEO  | Malibu       |
| Pepper Potts   | Stark Industries   | null       | CEO               | Los Angeles  |
| JARVIS         | Stark household    | null       | Assistant         | Malibu       |
|  -- secret --  | Daily Planet       | Superman   | Reporter          | Metropolis   |
| Lois Lane      | Daily Planet       | null       | Reporter          | Metropolis   |
|  -- secret --  | Empire State Univ  | Spiderman  | Student           | New York     |
|  -- secret --  | Wayne Enterprises  | Batman     | Philanthropist    | Gotham City  |
+----------------+--------------------+------------+-------------------+--------------+
7 rows selected (0.374 seconds)

使用Apache Drill视图掩盖数据

您可以在Drill中使用视图,比仅使用精美查询更安全地隐藏一些数据。 要创建视图,请找出一个查询,该查询为您提供了要在视图中公开的数据。 在这种情况下,我们将完全省略标识列,但是也可以使用之前的屏蔽查询。

0: jdbc:drill:> create view maprfs.ted.some_columns as select
. . . . . . . >    name,
. . . . . . . >    company,
. . . . . . . >    title,
. . . . . . . >    city
. . . . . . . > from maprfs.ted.`json`;
+-------+------------------------------------------------------------------+
|  ok   |                             summary                              |
+-------+------------------------------------------------------------------+
| true  | View 'some_columns' created successfully in 'maprfs.ted' schema  |
+-------+------------------------------------------------------------------+
1 row selected (0.494 seconds)

拥有“钻取”视图后,就可以将其用作普通表,但是如果该视图中未显示该数据,则无法访问该表中的数据。 由于列未知,从视图中选择身份会产生错误。

0: jdbc:drill:> select * from maprfs.ted.some_columns;
+---------------+--------------------+-------------------+--------------+
|     name      |     company        |     title         |     city     |
+---------------+--------------------+-------------------+--------------+
| Tony Stark    | Stark Industries   | Engineer; ex-CEO  | Malibu       |
| Pepper Potts  | Stark Industries   | CEO               | Los Angeles  |
| JARVIS        | Stark household    | Assistant         | Malibu       |
| Clark Kent    | Daily Planet       | Reporter          | Metropolis   |
| Lois Lane     | Daily Planet       | Reporter          | Metropolis   |
| Peter Parker  | Empire State Univ  | Student           | New York     |
| Bruce Wayne   | Wayne Enterprises  | Philanthropist    | Gotham City  |
+---------------+--------------------+-------------------+--------------+
7 rows selected (0.519 seconds)
0: jdbc:drill:>

请注意,如果您尝试创建一个已有的视图,则需要先将其删除。

0: jdbc:drill:> drop view maprfs.ted.some_columns;
+-------+---------------------------------------------------------------------+
|  ok   |                               summary                               |
+-------+---------------------------------------------------------------------+
| true  | View [some_columns] deleted successfully from schema [maprfs.ted].  |
+-------+---------------------------------------------------------------------+
1 row selected (0.489 seconds)

在内部,视图只是另一个经过特殊处理的文件。 定义视图的文件内容如下所示

[tdunning@se-node10 ~]$ cat some_columns.view.drill
{
  "name" : "some_columns",
  "sql" : "SELECT `name`, `company`, `title`, `city`\nFROM `maprfs`.`ted`.`json`",
  "fields" : [ {
      "name" : "name",
      "type" : "ANY",
      "isNullable" : true
  }, {
      "name" : "company",
      "type" : "ANY",
      "isNullable" : true
  }, {
      "name" : "title",
      "type" : "ANY",
      "isNullable" : true
  }, {
      "name" : "city",
      "type" : "ANY",
      "isNullable" : true
  } ],
  "workspaceSchemaPath" : [ ]
}
[tdunning@se-node10 ~]$

如您所见,Drill视图是用JSON编写的,它包含我们的原始查询和一些类型信息(这只是说一切都是ANY类型的,这是SQL的Drill扩展)。 也可以在视图中嵌入工作空间路径,这样您的用户就不必担心查询中的表实际位于何处。 打开视图的权限使您可以让其他人查询您的视图,从而允许他们查询基础文件,即使他们不能直接查询基础文件。 此技术使您可以为特定用户强制屏蔽某些数据。

请注意,在任何数据库意义上都没有使用短语“开放权限”。 从字面上看,这是更改包含视图的文件的权限的问题。 查询文件时也是如此-是否可以使用Drill读取文件取决于文件的权限,就像使用其他任何方式读取文件一样。

结论

Apache Drill是一个开源查询引擎,它将标准SQL的功能与现代大数据设置所需的灵活性结合在一起。 它还提供了一些共享或保护超级英雄身份的出色方法。 有关使用Drill的更多信息,请参见以下资源。

首先, 下载Apache Drill沙箱。 要了解有关钻取视图的更多信息,请参阅“ 安全共享大数据”的第3章©2015 Ted Dunning和Ellen Friedman(O'Reilly)

免费获得Drill的在线培训,请点击此处。

翻译自: https://www.javacodegeeks.com/2016/06/sql-query-mixed-schema-data-using-apache-drill.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值