Spark SQL----NULL语义

Spark SQL----NULL语义

  • 一、比较运算符中的空处理
  • 二、逻辑运算符中的空处理
  • 三、表达式中的空处理
    • 3.1 null-intolerant表达式中的空处理
    • 3.2 可以处理空值操作数的空处理表达式
    • 3.3 内置聚合表达式中的空处理
  • 四、WHERE、HAVING和JOIN子句中的条件表达式的空处理
  • 五、在GROUP BY和DISTINCT中空处理
  • 六、在ORDER BY中的空处理
  • 七、UNION, INTERSECT, EXCEPT中的空处理
  • 八、EXISTS 和NOT EXISTS 子查询中的空处理
  • 九、IN 和 NOT IN 子查询中的空处理

表由一组行组成,每行包含一组列。列与数据类型相关联,表示实体的特定属性(例如,age 是一个名为person的实体的列)。有时,特定于行的列的值在该行出现时是未知的。在SQL中,这些值表示为NULL。本节详细介绍了在各种运算符、表达式和其他SQL构造中处理NULL值的语义。
下面说明了名为person的表的schema layout和数据。数据在年龄列中包含NULL值,该表将用于以下各节中的各种示例。
TABLE: person

IdNameAge
100Joe30
200MarryNULL
300Mike18
400Fred50
500AlbertNULL
600Michelle30
700Dan50

一、比较运算符中的空处理

Apache spark支持标准的比较运算符,如“>”、“>=”、“=”、”<“和”<=“。当其中一个操作数或两个操作数都未知或为NULL时,这些运算符的结果为未知或NULL。为了比较NULL值的相等性,Spark提供了一个NULL安全的相等运算符(“<=>”),当其中一个操作数为NULL时,该运算符返回False,当两个操作数均为NULL时返回True。下表说明了当一个或两个操作数都为NULL时比较运算符的行为`:

Left OperandRight Operand>>==<<=<=>
NULLAny valueNULLNULLNULLNULLNULLFalse
Any valueNULLNULLNULLNULLNULLNULLFalse
NULLNULLNULLNULLNULLNULLNULLTrue
例子:
-- Normal comparison operators return `NULL` when one of the operand is `NULL`.
SELECT 5 > null AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+-- Normal comparison operators return `NULL` when both the operands are `NULL`.
SELECT null = null AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+-- Null-safe equal operator return `False` when one of the operand is `NULL`
SELECT 5 <=> null AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|            false|
+-----------------+-- Null-safe equal operator return `True` when one of the operand is `NULL`
SELECT NULL <=> NULL;
+-----------------+
|expression_output|
+-----------------+
|             true|
+-----------------+

二、逻辑运算符中的空处理

Spark支持标准逻辑运算符,如AND、OR和NOT。这些运算符将布尔表达式作为参数,并返回布尔值。
下表说明了当一个或两个操作数都为NULL时逻辑运算符的行为。

Left OperandRight OperandORAND
TrueNULLTrueNULL
FalseNULLNULLFalse
NULLTrueTrueNULL
NULLFalseNULLFalse
NULLNULLNULLNULL
operandNOT
NULLNULL

例子:

-- Normal comparison operators return `NULL` when one of the operands is `NULL`.
SELECT (true OR null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             true|
+-----------------+-- Normal comparison operators return `NULL` when both the operands are `NULL`.
SELECT (null OR false) AS expression_output
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+-- Null-safe equal operator returns `False` when one of the operands is `NULL`
SELECT NOT(null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+

三、表达式中的空处理

比较运算符和逻辑运算符在Spark中被视为表达式。除了这两种表达式之外,Spark还支持其他形式的表达式,如函数表达式、强制转换表达式等。Spark中的表达式大致可分为:

  • Null intolerant表达式
  • 可以处理NULL值操作数的表达式
    • 这些表达式的结果取决于表达式本身。

3.1 null-intolerant表达式中的空处理

当表达式的一个或多个参数为Null时,Null intolerant表达式返回Null,大多数表达式属于这一类。
例子:

SELECT concat('John', null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+SELECT positive(null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+SELECT to_date(null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+

3.2 可以处理空值操作数的空处理表达式

这类表达式被设计用来处理NULL值。表达式的结果取决于表达式本身。例如,函数表达式isnull在输入为空时返回true,在输入为非空时返回false,而函数coalesce返回其操作数列表中的第一个非null值。但是,coalesce在其所有操作数为NULL时返回NULL。下面是这类表达的不完整列表。

  • COALESCE
  • NULLIF
  • IFNULL
  • NVL
  • NVL2
  • ISNAN
  • NANVL
  • ISNULL
  • ISNOTNULL
  • ATLEASTNNONNULLS
  • IN

例子:

SELECT isnull(null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             true|
+-----------------+-- Returns the first occurrence of non `NULL` value.
SELECT coalesce(null, null, 3, null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|                3|
+-----------------+-- Returns `NULL` as all its operands are `NULL`. 
SELECT coalesce(null, null, null, null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|             null|
+-----------------+SELECT isnan(null) AS expression_output;
+-----------------+
|expression_output|
+-----------------+
|            false|
+-----------------+

3.3 内置聚合表达式中的空处理

聚合函数通过处理一组输入行来计算单个结果。下面是聚合函数如何处理NULL值的规则。

  • NULL值在所有聚合函数的处理过程中被忽略。
    • 此规则的唯一例外是COUNT(*)函数。
  • 当所有输入值为NULL或输入数据集为空时,一些聚合函数返回NULL。这些函数的列表如下:
    • MAX
    • MIN
    • SUM
    • AVG
    • EVERY
    • ANY
    • SOME
      例子:
-- `count(*)` does not skip `NULL` values.
SELECT count(*) FROM person;
+--------+
|count(1)|
+--------+
|       7|
+--------+-- `NULL` values in column `age` are skipped from processing.
SELECT count(age) FROM person;
+----------+
|count(age)|
+----------+
|         5|
+----------+-- `count(*)` on an empty input set returns 0. This is unlike the other
-- aggregate functions, such as `max`, which return `NULL`.
SELECT count(*) FROM person where 1 = 0;
+--------+
|count(1)|
+--------+
|       0|
+--------+-- `NULL` values are excluded from computation of maximum value.
SELECT max(age) FROM person;
+--------+
|max(age)|
+--------+
|      50|
+--------+-- `max` returns `NULL` on an empty input set.
SELECT max(age) FROM person where 1 = 0;
+--------+
|max(age)|
+--------+
|    null|
+--------+

四、WHERE、HAVING和JOIN子句中的条件表达式的空处理

WHERE、HAVING操作符根据用户指定的条件过滤行。JOIN操作符用于根据连接条件组合来自两个表的行。对于所有这三种操作符,条件表达式都是布尔表达式,可以返回True、False或Unknown (NULL)。如果条件的结果为True,则表示“满足”。
例子:

-- Persons whose age is unknown (`NULL`) are filtered out from the result set.
SELECT * FROM person WHERE age > 0;
+--------+---+
|    name|age|
+--------+---+
|Michelle| 30|
|    Fred| 50|
|    Mike| 18|
|     Dan| 50|
|     Joe| 30|
+--------+---+-- `IS NULL` expression is used in disjunction to select the persons
-- with unknown (`NULL`) records.
SELECT * FROM person WHERE age > 0 OR age IS NULL;
+--------+----+
|    name| age|
+--------+----+
|  Albert|null|
|Michelle|  30|
|    Fred|  50|
|    Mike|  18|
|     Dan|  50|
|   Marry|null|
|     Joe|  30|
+--------+----+-- Person with unknown(`NULL`) ages are skipped from processing.
SELECT age, count(*) FROM person GROUP BY age HAVING max(age) > 18;
+---+--------+
|age|count(1)|
+---+--------+
| 50|       2|
| 30|       2|
+---+--------+-- A self join case with a join condition `p1.age = p2.age AND p1.name = p2.name`.
-- The persons with unknown age (`NULL`) are filtered out by the join operator.
SELECT * FROM person p1, person p2WHERE p1.age = p2.ageAND p1.name = p2.name;
+--------+---+--------+---+
|    name|age|    name|age|
+--------+---+--------+---+
|Michelle| 30|Michelle| 30|
|    Fred| 50|    Fred| 50|
|    Mike| 18|    Mike| 18|
|     Dan| 50|     Dan| 50|
|     Joe| 30|     Joe| 30|
+--------+---+--------+---+-- The age column from both legs of join are compared using null-safe equal which
-- is why the persons with unknown age (`NULL`) are qualified by the join.
SELECT * FROM person p1, person p2WHERE p1.age <=> p2.ageAND p1.name = p2.name;
+--------+----+--------+----+
|    name| age|    name| age|
+--------+----+--------+----+
|  Albert|null|  Albert|null|
|Michelle|  30|Michelle|  30|
|    Fred|  50|    Fred|  50|
|    Mike|  18|    Mike|  18|
|     Dan|  50|     Dan|  50|
|   Marry|null|   Marry|null|
|     Joe|  30|     Joe|  30|
+--------+----+--------+----+

五、在GROUP BY和DISTINCT中空处理

如章节一比较运算符中的空处理中所讨论的,两个NULL值不相等。但是,出于分组和不同处理的目的,将具有NULL数据的两个或多个值分组到同一个bucket中。这种行为符合SQL标准和其他企业数据库管理系统。
例子:

-- `NULL` values are put in one bucket in `GROUP BY` processing.
SELECT age, count(*) FROM person GROUP BY age;
+----+--------+
| age|count(1)|
+----+--------+
|null|       2|
|  50|       2|
|  30|       2|
|  18|       1|
+----+--------+-- All `NULL` ages are considered one distinct value in `DISTINCT` processing.
SELECT DISTINCT age FROM person;
+----+
| age|
+----+
|null|
|  50|
|  30|
|  18|
+----+

六、在ORDER BY中的空处理

Spark SQL在ORDER BY子句中支持空排序规范。Spark处理ORDER BY子句时,首先或最后放置所有NULL值,这取决于空排序规范。默认情况下,所有NULL值放在首位。
例子:

-- `NULL` values are shown at first and other values
-- are sorted in ascending way.
SELECT age, name FROM person ORDER BY age;
+----+--------+
| age|    name|
+----+--------+
|null|   Marry|
|null|  Albert|
|  18|    Mike|
|  30|Michelle|
|  30|     Joe|
|  50|    Fred|
|  50|     Dan|
+----+--------+-- Column values other than `NULL` are sorted in ascending
-- way and `NULL` values are shown at the last.
SELECT age, name FROM person ORDER BY age NULLS LAST;
+----+--------+
| age|    name|
+----+--------+
|  18|    Mike|
|  30|Michelle|
|  30|     Joe|
|  50|     Dan|
|  50|    Fred|
|null|   Marry|
|null|  Albert|
+----+--------+-- Columns other than `NULL` values are sorted in descending
-- and `NULL` values are shown at the last.
SELECT age, name FROM person ORDER BY age DESC NULLS LAST;
+----+--------+
| age|    name|
+----+--------+
|  50|    Fred|
|  50|     Dan|
|  30|Michelle|
|  30|     Joe|
|  18|    Mike|
|null|   Marry|
|null|  Albert|
+----+--------+

七、UNION, INTERSECT, EXCEPT中的空处理

在集合操作的上下文中,以null-safe的方式比较NULL值是否相等。这意味着在比较行时,两个NULL值被认为是相等的,这与常规的EqualTo(=)操作符不同。
例子:

CREATE VIEW unknown_age SELECT * FROM person WHERE age IS NULL;-- Only common rows between two legs of `INTERSECT` are in the 
-- result set. The comparison between columns of the row are done
-- in a null-safe manner.
SELECT name, age FROM personINTERSECTSELECT name, age from unknown_age;
+------+----+
|  name| age|
+------+----+
|Albert|null|
| Marry|null|
+------+----+-- `NULL` values from two legs of the `EXCEPT` are not in output. 
-- This basically shows that the comparison happens in a null-safe manner.
SELECT age, name FROM personEXCEPTSELECT age FROM unknown_age;
+---+--------+
|age|    name|
+---+--------+
| 30|     Joe|
| 50|    Fred|
| 30|Michelle|
| 18|    Mike|
| 50|     Dan|
+---+--------+-- Performs `UNION` operation between two sets of data. 
-- The comparison between columns of the row ae done in
-- null-safe manner.
SELECT name, age FROM personUNION SELECT name, age FROM unknown_age;
+--------+----+
|    name| age|
+--------+----+
|  Albert|null|
|     Joe|  30|
|Michelle|  30|
|   Marry|null|
|    Fred|  50|
|    Mike|  18|
|     Dan|  50|
+--------+----+

八、EXISTS 和NOT EXISTS 子查询中的空处理

在Spark中,允许在WHERE子句中使用EXISTS和NOT EXISTS表达式。这些是返回TRUE或FALSE的布尔表达式。换句话说,EXISTS是一个成员条件,当它引用的子查询返回一行或多行时返回TRUE。类似地,NOT EXISTS是一个非成员条件,当从子查询返回no rows或zero rows时返回TRUE。这两个表达式不受子查询结果中存在NULL的影响。它们通常更快,因为它们可以转换为semijoins / anti-semijoins,而无需为null感知提供特殊规定。
例子:

-- Even if subquery produces rows with `NULL` values, the `EXISTS` expression
-- evaluates to `TRUE` as the subquery produces 1 row.
SELECT * FROM person WHERE EXISTS (SELECT null);
+--------+----+
|    name| age|
+--------+----+
|  Albert|null|
|Michelle|  30|
|    Fred|  50|
|    Mike|  18|
|     Dan|  50|
|   Marry|null|
|     Joe|  30|
+--------+----+-- `NOT EXISTS` expression returns `FALSE`. It returns `TRUE` only when
-- subquery produces no rows. In this case, it returns 1 row.
SELECT * FROM person WHERE NOT EXISTS (SELECT null);
+----+---+
|name|age|
+----+---+
+----+---+-- `NOT EXISTS` expression returns `TRUE`.
SELECT * FROM person WHERE NOT EXISTS (SELECT 1 WHERE 1 = 0);
+--------+----+
|    name| age|
+--------+----+
|  Albert|null|
|Michelle|  30|
|    Fred|  50|
|    Mike|  18|
|     Dan|  50|
|   Marry|null|
|     Joe|  30|
+--------+----+

九、IN 和 NOT IN 子查询中的空处理

在Spark中,允许在查询的WHERE子句中使用IN和NOT IN表达式。与EXISTS表达式不同,IN表达式可以返回TRUE、FALSE或UNKNOWN(NULL)值。从概念上讲,IN表达式在语义上等价于由disjunctive运算符(OR)分隔的一组相等条件。例如,c1 IN (1, 2, 3)在语义上等价于 (C1 = 1 OR c1 = 2 OR c1 = 3)。
就处理NULL值而言,语义可以从比较运算符(=)和逻辑运算符(OR)中的NULL值处理中推导出来。总之,以下是计算IN表达式结果的规则。

  • 当在列表中找到有问题的非NULL值时,返回TRUE
  • 当在列表中找不到非NULL值并且列表中不包含NULL值时,返回FALSE
  • 当值为NULL,或者在列表中找不到非NULL值并且列表至少包含一个NULL值时,返回UNKNOWN

当列表包含NULL时,NOT IN总是返回UNKNOWN,与输入值无关。这是因为如果值不在包含NULL的列表中,IN将返回UNKNOWN,并且因为not UNKNOWN再次为UNKNOW。
例子:

-- The subquery has only `NULL` value in its result set. Therefore,
-- the result of `IN` predicate is UNKNOWN.
SELECT * FROM person WHERE age IN (SELECT null);
+----+---+
|name|age|
+----+---+
+----+---+-- The subquery has `NULL` value in the result set as well as a valid 
-- value `50`. Rows with age = 50 are returned. 
SELECT * FROM personWHERE age IN (SELECT age FROM VALUES (50), (null) sub(age));
+----+---+
|name|age|
+----+---+
|Fred| 50|
| Dan| 50|
+----+---+-- Since subquery has `NULL` value in the result set, the `NOT IN`
-- predicate would return UNKNOWN. Hence, no rows are
-- qualified for this query.
SELECT * FROM personWHERE age NOT IN (SELECT age FROM VALUES (50), (null) sub(age));
+----+---+
|name|age|
+----+---+
+----+---+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Camera Raw:直方图

Camera Raw 的直方图 Histogram面板不仅提供了照片亮度和色彩分布信息&#xff0c;还具备多项实用功能&#xff0c;辅助评估和调整照片。 ◆ ◆ ◆ 直方图的构成 直方图是一个二维坐标系统&#xff0c;横坐标表示不同程度的像素亮度&#xff0c;从左到右通常对应的是 0 ~ 255…

升级springboot3.2集成shiro的问题

由于之前的springcloud相关版本太久&#xff0c;很多新功能无法使用&#xff0c;所以打算抽时间把代码的版本做一下升级。使用最新版的springboot3.2&#xff0c;发现shiro过滤器无效。经检查发现原因&#xff1a; springboot3.x使用的是JDK17&#xff0c;从jdk8以后javax.serv…

视频智能解析:Transformer模型在视频理解的突破性应用

视频智能解析&#xff1a;Transformer模型在视频理解的突破性应用 随着人工智能技术的飞速发展&#xff0c;视频理解已成为计算机视觉领域的一个热点问题。Transformer模型&#xff0c;以其在处理序列数据方面的强大能力&#xff0c;已经被广泛应用于视频理解任务中。本文将深…

Github 2024-07-11 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Python项目1frp: 一个开源的快速反向代理 创建周期:2946 天开发语言:Go协议类型:Apache License 2.0Star数量:75872 …

Spring的bean的生命周期——bean的创建与销毁

1、生成类信息map 扫描包&#xff0c;用asm技术获取类信息&#xff0c;打了ComponentScancomponentservice等注解的类会放入map。key是类名&#xff0c;value是beanDefinition类的基本信息 2、加载类 context.getBean("userService") 从类信息map中获取beanDefin…

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性&#xff1f; SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

对controller层进行深入学习

目录 1. controller层是干什么的&#xff1f;1.1 controller原理图1.2 controller层为什么要存在&#xff1f;1.2.1 分离关注点1.2.2 响应HTTP请求1.2.3 数据处理与转换1.2.4 错误处理与状态管理1.2.5 流程控制1.2.6 依赖注入与测试 1.3 controller层的优点1.3.1 多端支持1.3.2…

Gin框架自定义路由

Gin框架是一个用Go语言&#xff08;Golang&#xff09;编写的Web框架&#xff0c;它提供了灵活且高效的路由系统。在Gin框架中&#xff0c;自定义路由是一个基础且重要的操作&#xff0c;它允许开发者定义应用程序如何处理不同的HTTP请求。以下是自定义路由的详细步骤和方法&am…

Linux虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理

Linux 虚拟化大师&#xff1a;使用 KVM 和 QEMU 进行高级虚拟化管理 虚拟化技术是现代数据中心的核心技术之一&#xff0c;它可以将一台物理服务器分割成多个虚拟机&#xff0c;从而提高资源利用率&#xff0c;降低成本&#xff0c;并增强系统的灵活性和可扩展性。KVM&#xf…

C++ | Leetcode C++题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…

nasa数据集——1 度网格单元的全球月度土壤湿度统计数据

AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Averages V005 (AMSRE_AVRMO) at GES DISC GES DISC 的 AMSR-E/Aqua 第 3 级全球地表土壤水分月平均值 V005 (AMSRE_AVRMO) AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Standard Deviation V005 (…

优化 .NET Core 应用程序的安全性和性能以应对高负载

一. .NET Core 中的安全措施 1. 身份验证和授权 实施强大的身份验证和授权机制是保护应用程序资源的基础。.NET Core 内置支持各种身份验证方案&#xff0c;例如 JWT&#xff08;JSON Web 令牌&#xff09;、OAuth 和 OpenID Connect。通过配置身份验证中间件并定义授权策略&…

vue中el-table单元格复制功能

一、单页面中使用 1.在el-table上绑定单击事件 cell-click“copyText” 或双击事件 cell-dblclick“copyText” 注&#xff1a;cell-dblclick函数有四个参数&#xff0c;分别是row, column, cell, event&#xff1b; row&#xff1a;可看到被其操作单元格所在行的所有的数据&…

【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器

文章目录 引言什么是 final 关键字&#xff1f;一、 final 变量final 局部变量final 实例变量final 静态变量 二、 final 方法三、 final 类四、 final 关键字的实际应用1. 定义常量2. 防止方法被重写3. 创建不可变类4. 优化性能 五、 final 的一些常见误区1. final 变量不能在…

力扣995.K连续位的最小翻转次数

力扣995.K连续位的最小翻转次数 因为翻转顺序改变不影响最终结果 因此从头找每个位置翻转后的结果如果为0 将从它开始的K长的数组翻转 class Solution {public:int minKBitFlips(vector<int>& nums, int k) {int n nums.size();vector<int> s(n1);int res0…

05.FFMPEG日志系统

一、头文件 #include <libavutil/log.h> 二、常用函数 1、av_log_set_level void av_log_set_level(int level);该函数用于设置全局日志级别。 2、av_log void av_log(void* avcl, int level, const char* fmt, ...);该函数用于输出日志消息。avcl 参数是相关联的上下…

uboot学习:(三)目录分析

目录 目录分析 uboot自带 编译生成的文件 分析之前需要编译一次uboot源码&#xff0c;编译之后的uboot源码会多出来很多文件 目录分析 uboot自带 api 与硬件无关的API函数arch 与架构体系有关的代码 里面有x86,arm等架构文件夹 架构文件夹里面有cpu&#xff0c;设备树等…

使用 Nuxt 3 搭建国际官网

搭建国际官网是一个复杂的任务,涉及多方面的技术和策略。在这篇文章中,我们将探讨如何使用 Nuxt 3 框架搭建一个国际化官网,并展示其在 SEO 优势和全栈可维护性方面的卓越性能。 使用 Nuxt 3 搭建国际官网 1. Nuxt 3 简介 Nuxt 3 是一个基于 Vue 3 和 Vite 的框架,旨在构…

大数据面试题之ElasticSearch(2)

目录 ElasticSearch的单播、多播和广播 什么是Zen Discovery机制 ElasticSearch和Solr主要区别 ElasticSearch和Solr各自适用于哪些场景 Elasticsearch的同类产品有哪些 Elasticsearch有哪些主要应用场景 Elasticsearch 中执行搜索的各种可能方式有哪些 Elasticsearch 中…