本文针对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)! 秃头涂涂: 请问初始化sparkconf是什么意思啊? 数据倾斜--持续更新 wennwennn: Spark使用jdbc时的并行度 我刚试了一下确实丢数了,只能读取参数设置的最大条数,如果原数据库数据量大于最大条数,就会丢数