gpt4 book ai didi

scala - 无法读取由 Parquet 支持的区分大小写的 Glue 表

转载 作者:行者123 更新时间:2023-12-04 10:44:24 27 4
gpt4 key购买 nike

Spark 版本:Amazon EMR 5.24.0 上的 2.4.2

我有一个由 S3 Parquet 目录支持的 Glue Catalog 表。 Parquet 文件具有区分大小写的列名(如 lastModified )。无论我做什么,当使用 Spark 读取 Glue Catalog 表时,我都会得到小写的列名( lastmodified ):

for {
i <- Seq(false, true)
j <- Seq("NEVER_INFER", "INFER_AND_SAVE", "INFER_ONLY")
k <- Seq(false, true)
} {
val spark = SparkSession.builder()
.config("spark.sql.hive.convertMetastoreParquet", i)
.config("spark.sql.hive.caseSensitiveInferenceMode", j)
.config("spark.sql.parquet.mergeSchema", k)
.enableHiveSupport()
.getOrCreate()

import spark.sql

val df = sql("""SELECT * FROM ecs_db.test_small""")
df.columns.foreach(println)
}

[1] https://medium.com/@an_chee/why-using-mixed-case-field-names-in-hive-spark-sql-is-a-bad-idea-95da8b6ec1e0
[2] https://spark.apache.org/docs/latest/sql-data-sources-parquet.html

最佳答案

编辑

下面的解决方案是不正确的。

  • Glue Crawler 不应该设置 spark.sql.sources.schema.*属性,但 Spark SQL 应该。 Spark 2.4 中的默认值 spark.sql.hive.caseSensitiveInferenceModeINFER_AND_SAVE这意味着 Spark 从底层文件推断模式并更改表以添加 spark.sql.sources.schema.*属性到 SERDEPROPERTIES .在我们的例子中,Spark 没有这样做,因为 IllegalArgumentException: Can not create a Path from an empty string由于 Hive 数据库类实例具有空 locationUri 引起的异常属性字符串。这是因为 Glue 数据库没有位置属性 enter image description here .保存模式后,Spark 从表中读取它。
  • 可以通过设置 INFER_ONLY 来解决这个问题。 ,它应该只从文件中推断架构,而不是尝试更改表 SERDEPROPERTIES .但是,由于 Spark 错误,这不起作用,其中推断的架构然后被小写(请参阅 here )。


  • 原始解决方案(错误)

    发生此错误是因为 Glue 表的 SERDEPROPERTIES缺少两个重要的属性:
  • spark.sql.sources.schema.numParts
  • spark.sql.sources.schema.part.0

  • 为了解决这个问题,我不得不通过 Glue 控制台添加这两个属性(不能用 ALTER TABLE … 来做)

    我猜这是 Glue 爬虫的一个错误,它在创建表时没有设置这些属性。

    关于scala - 无法读取由 Parquet 支持的区分大小写的 Glue 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59774349/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com