在Apache Spark官方文档中的Parquet Files的“ 配置”部分中:
spark.sql.parquet.writeLegacyFormat (默认值:
false)如果为true,则将以Spark 1.4及更低版本写入数据。例如,十进制值将以Apache
Parquet的固定长度字节数组格式编写,其他系统(例如Apache Hive和Apache
Impala)将使用该格式。如果为false,将使用Parquet中较新的格式。例如,小数将以基于int的格式编写。如果Parquet输出打算用于不支持这种较新格式的系统,请设置为true。
官方文档更新前给出的答案
Hive无法读取由Spark编写的非常相似的SPARK-20297
Parquet
Decimal(12,2),并且Impala最近(20
/ Apr / 17 01:59)解决为“不是问题”。
主要要点是使用
spark.sql.parquet.writeLegacyFormat属性并以旧格式编写实木复合地板元数据(我在官方文档的“
配置”下没有看到此描述,而在SPARK-20937中对此进行了报告)。
启用spark.sql.parquet.writeLegacyFormat时,Hive和Impala可以读取Spark写入的数据。
它确实遵循更新的标准-https://github.com/apache/parquet-
format/blob/master/LogicalTypes.md#decimal,但我错过了文档。难道不是Impala或Hive中的bug?int32 /
int64选项存在于十进制规范的原始版本中,但并未得到广泛实现:https :
//github.com/Parquet/parquet-
format/commit/b2836e591da8216cfca47075baee2c9a7b0b9289。因此,这不是新旧版本,它只是许多系统未实现的替代表示。
这本SPARK-10400也可能是非常有帮助的读物(关于
spark.sql.parquet.writeLegacyFormat财产的历史):
在致力于在SPARK-6777中实现Parquet向后兼容规则时,我们引入了SQL选项“
spark.sql.parquet.followParquetFormatSpec”。它指示我们是否应该使用Spark
1.4和更早版本采用的旧Parquet格式,还是使用Parquet格式规范中定义的标准格式。但是,此选项的名称有些令人困惑,因为我们不应该遵循该规范并不是超级直观。最好将其重命名为“
spark.sql.parquet.writeLegacyFormat”并反转其默认值(它们的含义相反)。请注意,此选项不是“
public”(isPublic为false)。



