关于sparksql中的hint

前言

在Spark中,结构化查询可以通过指定查询提示(hint)来进行优化。

查询提示,即向查询加入注释,告诉查询优化器提供如何优化逻辑计划, 这在查询优化器无法做出最佳决策时十分有用。

Spark SQL支持COALESCE,REPARTITION以及BROADCAST提示。 在分析查询语句时,所有剩余的未解析的提示将从查询计划中被移除。

Spark SQL 2.2增加了对提示框架(Hint Framework)的支持。

如何使用查询提示hint

我们可以使用Dataset.hint运算符或带有提示的SELECT SQL语句指定查询提示。

// Dataset API
val q = spark.range(1).hint(name = "myHint", 100, true)
val plan = q.queryExecution.logical
scala> println(plan.numberedTreeString)
00 'UnresolvedHint myHint, [100, true]
01 +- Range (0, 1, step=1, splits=Some(8))

// SQL
val q = sql("SELECT /*+ myHint (100, true) */ 1")
val plan = q.queryExecution.logical
scala> println(plan.numberedTreeString)
00 'UnresolvedHint myHint, [100, true]
01 +- 'Project [unresolvedalias(1, None)]
02    +- OneRowRelation

SELECT SQL语句支持查询提示作为SQL查询中的注释,Spark SQL将其转换为逻辑计划中的UnresolvedHint一元逻辑运算符。

COALESCE 和 REPARTITION 提示
Spark SQL 2.4增加了对COALESCE和REPARTITION提示的支持(使用SQL注释), 语法如下:

SELECT /*+ COALESCE(5) */ …?

SELECT /*+ REPARTITION(3) */ …?

Broadcast提示
Spark SQL 2.2支持使用广播标准函数或SQL注释的BROADCAST提示 ,语法如下:

SELECT /*+ MAPJOIN(b) */ …?

SELECT /*+ BROADCASTJOIN(b) */ …?

SELECT /*+ BROADCAST(b) */ …?

参考资料

Hint Framework

原文地址:https://www.cnblogs.com/lestatzhang/p/10669547.html

时间: 2024-10-26 05:27:52

关于sparksql中的hint的相关文章

sparkSQL中cache的若干问题

摘要 sparkSQL在使用cache缓存的时候,有时候缓存可能不起作用,可能会发出缓存是假的吧的感慨.现在我们就把这个问题说道说道.问题 场景描述 当我们通过spark进行统计和处理数据时,发现他是延迟计算的,如果一个应用中出现多个action,而这多个action处理同一个数据源数据时,数据源用时间来过滤数据时,由于有多个action操作,遇到每个action就是一个job,每一个action都会执行数据源获取数据的操作,由于两个action之间的操作存在时间差,这两个action获取的数据

sparkSQL中udf的使用

在Spark中使用sql时一些功能需要自定义方法实现,这时候就可以使用UDF功能来实现 多参数支持 UDF不支持参数*的方式输入多个参数,例如String*,不过可以使用array来解决这个问题. 定义udf方法,此处功能是将多个字段合并为一个字段 def allInOne(seq: Seq[Any], sep: String): String = seq.mkString(sep) 在sql中使用 sqlContext.udf.register("allInOne", allInOn

sparkSQL中RDD——DataFrame——DataSet的区别

spark中RDD.DataFrame.DataSet都是spark的数据集合抽象,RDD针对的是一个个对象,但是DF与DS中针对的是一个个Row RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信,还是IO操作都需要对对象的结构和数据进行序列化和反序列化 GC的性能开销,频繁的创建和销毁对象,势必会增加GC开销 DataFrameDataFrame引入了schema和off-hea

自定义ANDROID中EDITTEXT中的HINT文本的大小

EditText editText = (EditText) rootView.findViewById(R.id.et); // 新建一个可以添加属性的文本对象 SpannableString ss = new SpannableString("喝酒就要喝一斤!"); // 新建一个属性对象,设置文字的大小 AbsoluteSizeSpan ass = new AbsoluteSizeSpan(8,true); // 附加属性到文本 ss.setSpan(ass, 0, ss.len

spark中使用sparksql对日志进行分析(属于小案例)

一:使用sparksql开发 1.sparksql开发的两种方式 HQL:SQL语句开发 eq : sqlContext.sql("xxxx") DSL : sparkSql中DataFrame的API调用方式 eq:val df=sqlContext.xxx df.select("number") 二:HQL的开发案例 1.新建目录上传日志 2.书写程序

Oracle中常见的Hint(一)

Oracle中的Hint可以用来调整SQL的执行计划,提高SQL执行效率.下面分类介绍Oracle数据库中常见的Hint.这里描述的是Oracle11gR2中的常见Hint,Oracle数据库中各个版本中的Hint都不尽相同,所以这里讲述的的Hint可能并不适用于Oracle早期的版本. 一.与优化器模式相关的Hint 1.ALL_ROWS ALL_ROWS是针对整个目标SQL的Hint,它的含义是让优化器启用CBO,而且在得到目标SQL的执行计划时会选择那些吞吐量最佳的执行路径.这里的"吞吐量

Oracle中Hint被忽略的几种常见情形

Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略目标SQL中的Hint.由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警告,更不会报错,目标SQL依然可以正常运行,这也符合Hint实际上是一种特殊注释的身份.注释本来就是可有可无的东西,不应该因为它的存在而而导致原先在没有Hint时可以正常执行的SQL因为加了Hint后而变得不能正常执行. 下面来看几种Hint被Oracle忽略的常见情形. 1 使用的Hint有语法或

Oracle中Hint深入理解

Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从 而使语句高效的运行.例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描.在Oracle 中,是通过为语句添加 Hints(提示)来实现干预优化器优化的目的. 不建议在代码

Oracle中Hint深入理解(原创)

http://czmmiao.iteye.com/blog/1478465 Hint概述  基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从 而使语句高效的运行.例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描.在Oracle 中,