本文针对spark的spark.sql.hive.caseSensitiveInferenceMode的参数含义及使用进行梳理、总结
1. 参数含义
Spark 2.1.1引入了一个新的配置项: spark.sql.hive.caseSensitiveInferenceMode,默认值是NEVER_INFER,保持与spark 2.1.0一致的行为。但是Spark 2.2.0将此配置的默认值更改为INFER_AND_SAVE,以恢复读取底层文件schema中包含大小写混合列名的Hive元存储表的兼容性。使用INFER_AND_SAVE时,在第一次访问时,Spark将对任何没有保存推断的schema结果的Hive metastore table执行schema推断。注意,对于具有数千个分区的表来说,schema推断是一项非常耗时的操作。 如果不考虑与大小写混合列名的兼容性,您可以安全地将spark.sql.hive.caseSensitiveInferenceMode设置为NEVER_INFER,以避免schema推断的初始开销。注意,使用新的默认设置INFER_AND_SAVE,schema推断的结果将作为元存储键保存,以备将来使用。因此,初始schema推断只发生在表的第一次访问时。
从Spark 2.2.1和2.3.0,当数据源表具有partition schema和 data schema中都存在的列时,总是在运行时推断schema。推断的schema没有分区列。Spark在读取表时,只考虑这些重叠列的分区值,而不考虑数据源文件中存储的值。在2.2.0和2.1.x发布后,推断的schema被分区,但表的数据对用户是不可见的(即结果集是空的)。
在Spark 2.4及更早的版本中,当读取带有Spark原生数据源(parquet/orc)的Hive Serde表时,Spark会推断出实际的文件schema,并在metastore中更新表schema。从Spark 3.0开始,Spark不再推断schema。这应该不会给最终用户造成任何问题,但如果有,请将spark.sql.hive.caseSensitiveInferenceMode设置为INFER_AND_SAVE。
从spark不同版本来看,spark.sql.hive.caseSensitiveInferenceMode的默认行为先从不推荐schema, 然后变为运行时推断Schema,但最后又变为不推断。
注意:需要根据自己使用的spark 版本,调整此参数的值,以避免产生不可预料的结果,如读取hive表超级慢、内存溢出
2. 源码
spark.sql.hive.caseSensitiveInferenceMode有3种模式,推断并保存(spark 2.4.x默认模式)、仅推断、从不推断
推断并保存是指推断底层数据文件的大小写敏感的schema,并写回hive表的属性。
从不推断是指回退到使用不区分大小写的元存储Schema而不是推断
当不能从Hive表的属性中读取区分大小写的schema时,spark根据此参数采用不同的行为。
虽然Spark SQL本身不是区分大小写的,但是Hive兼容的文件格式,比如Parquet,是区分大小写的
Spark查询后端存储文件包含大小写敏感的列名称时,必须使用保留大小写的schema, 否则返回的结果可能不准确。
object HiveCaseSensitiveInferenceMode extends Enumeration {
val INFER_AND_SAVE, INFER_ONLY, NEVER_INFER = Value
val HIVE_CASE_SENSITIVE_INFERENCE = buildConf("spark.sql.hive.caseSensitiveInferenceMode")
.doc("Sets the action to take when a case-sensitive schema cannot be read from a Hive " +
"table's properties. Although Spark SQL itself is not case-sensitive, Hive compatible file " +
"formats such as Parquet are. Spark SQL must use a case-preserving schema when querying " +
"any table backed by files containing case-sensitive field names or queries may not return " +
"accurate results. Valid options include INFER_AND_SAVE (the default mode-- infer the " +
"case-sensitive schema from the underlying data files and write it back to the table " +
"properties), INFER_ONLY (infer the schema but don't attempt to write it to the table " +
"properties) and NEVER_INFER (fallback to using the case-insensitive metastore schema " +
"instead of inferring).")
.stringConf
.transform(_.toUpperCase(Locale.ROOT))
.checkValues(HiveCaseSensitiveInferenceMode.values.map(_.toString))
.createWithDefault(HiveCaseSensitiveInferenceMode.INFER_AND_SAVE.toString)
参考
https://spark.apache.org/docs/2.4.0/sql-migration-guide-upgrade.html
https://spark.apache.org/docs/3.0.0-preview/sql-migration-guide.html
https://issues.apache.org/jira/browse/SPARK-20888
https://issues.apache.org/jira/browse/SPARK-22306
本文针对spark的spark.sql.hive.caseSensitiveInferenceMode的参数含义及使用进行梳理、总结1. 参数含义Spark 2.1.1引入了一个新的配置项: spark.sql.hive.caseSensitiveInferenceMode,默认值是NEVER_INFER,保持与spark 2.1.0一致的行为。但是Spark 2.2.0将此配置的默认值更改为INFER_AND_SAVE,以恢复读取底层文件schema中包含大小写混合列名的Hive元存储表的兼容性。使
本文针对
spark
的
spark
.
sql
.
hive
.
case
SensitiveInfe
re
nce
Mode
的
参数
含义
及使用进行梳理、总结
1.
参数
含义
Spark
2.1.1引入了一个新的配置项:
spark
.
sql
.
hive
.
case
SensitiveInfe
re
nce
Mode
,默认值是NEVER_
INFER
,保持与
spark
2.1.0一致的行为。但是
Spark
2.2.0将此配置的默认值更改为
INFER
_AND_SAVE,以恢复读取底层文件schema中包含
大小写
混合列名的
Hive
元存储表的兼容性。.
Spark
SQL
里面有很多的
参数
,而且这些
参数
在
Spark
官网中没有明确的解释,可能是太多了吧,可以通过在
spark
-
sql
中使用set -v 命令显示当前
spark
-
sql
版本支持的
参数
。
本文讲解最近关于在参与
hive
往
spark
迁移过程中遇到的一些
参数
相关问题的调优。
内容分为两部分,第一部分讲遇到异常,从而需要通过设置
参数
来解决的调优;第二部分讲用于提升性能而进行的调优。
异常调优...
spark
.
sql
.
hive
.convertMetastore
Parquet
spark
.
sql
.files.ignoreMissingFiles &&
spark
.
sql
.files.ignoreCorruptFiles
spark
.
sql
.
hive
.verifyPartitionPath
spark
.fil...
set
spark
.
sql
.
case
Sensitive=FALSE; 设置不区分
大小写
set
spark
.speculation.interval='500';--检测周期,单位为毫秒
set
spark
.speculation.quantile='0.75';--完成task的百分比时启动推测
set
spark
.speculation.multiplier='1.5'; --比其它的慢多少倍时启动推测
set
spark
.streaming.concurrentJobs='3'; --控制job并发度
1.
Sql
Context默认
大小写
不
敏感
,如果DataFrame中有字段相同,
大小写
不同,在使用字段的时候不会引起歧义。
2.
Hive
Context提供更多的
Hive
预置函数,可以更高效的进行数据分析,默认
大小写
不
敏感
。
注意:在
spark
2.x中没有出现
Sql
Context
大小写
敏感
问题!
sql
Context.
sql
("select * from user")...
1.谈谈你对
Spark
SQL
的理解
Spark
SQL
是一个用来处理结构化数据的
Spark
组件,前身是shark,但是shark过多的依赖于
hive
如采用
hive
的语法解析器、查询优化器等,制约了
Spark
各个组件之间的相互集成,因此
Spark
SQL
应运而生大数据培训。
Spark
SQL
在汲取了shark诸多优势如内存列存储、兼容
hive
等基础上,做了重新的构造,因此也摆脱了对
hive
的依赖,但同时兼容
hive
。除了采取内存列存储优化性能,还引入了字节码生成技术、CBO和RBO对查询等进行动态评估
Hive
区分
大小写
,
Parquet
不区分
大小写
;
Hive
允许所有的列为空,而
Parquet
不允许所有列为空;
基于上述两点区别,在进行
Hive
metastore
Parquet
转换为Spqrk
Sql
Parquet
时,需要将两者的结构进行一致化,其一致化规则:
两者同名字段必须具有相同的数据类型,一致化后的字段必须为...
* Invalidates and refreshes all the cached data and metadata of the given table. For performa
nce
* reasons,
Spark
SQL
or the external data source library it uses might cache certain metadata
"
hive
-f
hive
_ticket.
sql
" 是在使用 Apache
Hive
查询语言时,执行指定的
SQL
脚本文件的命令。该命令将在命令行中执行,需要在
Hive
客户端中运行。具体来说,"-f"
参数
指定要执行的脚本文件,"
hive
_ticket.
sql
" 是指脚本文件的名称。
例如,如果需要执行名为 "
hive
_ticket.
sql
" 的
Hive
SQL
脚本文件,可以使用以下命令:
hive
-f
hive
_ticket.
sql
这将启动
Hive
客户端,并执行 "
hive
_ticket.
sql
" 文件中包含的
SQL
查询语句。脚本文件中可以包含多个查询语句,每个查询语句以分号 ";" 结束。执行完成后,
Hive
客户端将显示查询结果或错误信息。
Address already in use: Service 'SparkUI' failed after 16 retries (starting from 4040)!
秃头涂涂:
数据倾斜--持续更新
wennwennn:
Spark使用jdbc时的并行度