![](/img/trans.png)
[英]Spark not using partition information from Hive partitioned external table
[英]Apache Spark not using partition information from Hive partitioned external table
我有一个简单的 Hive-External 表,它是在 S3 之上创建的(文件为 CSV 格式)。 当我运行 hive 查询时,它会显示所有记录和分区。
但是,当我在 Spark 中使用同一个表时(其中 Spark SQL 在分区列上有一个 where 条件),它没有显示应用了分区过滤器。 但是对于 Hive Managed table ,Spark 能够使用分区信息并应用分区过滤器。
是否有任何标志或设置可以帮助我在 Spark 中使用 Hive 外部表的分区? 谢谢。
更新 :
出于某种原因,只有火花计划没有显示分区过滤器。 但是,当您查看加载的数据时,它只会加载分区所需的数据。
例如:其中 rating=0 ,仅加载一个 1 MB 的文件,当我没有过滤器时,它会读取 3 MB 的所有 3 个分区
tl; dr 在运行 sql 之前为外部表spark.sql("set spark.sql.hive.convertMetastoreOrc=true")
行为的差异不是因为外部/托管表。
行为取决于两个因素
1. 表的创建位置(Hive 或 Spark)
2.文件格式(我相信在这种情况下是ORC,来自屏幕截图)
如果该表是使用 Spark API 创建的,则将其视为数据源表。
如果该表是使用 HiveQL 创建的,则它被视为 Hive 本机表。
这两个表的元数据都存储在 Hive Metastore 中,唯一的区别在于表的TBLPROPERTIES
的provider
字段( describe extended <tblName>
)。 属性的值为orc
或在 Spark 表和hive
为空。
当 provider 不是hive
(数据源表)时,Spark 使用其原生方式处理数据。
如果 provider 是hive
,Spark 使用 Hive 代码来处理数据。
Spark 提供配置标志以指示引擎使用 Datasource 方式处理流动文件格式的数据 = Orc
和Parquet
标志:
Orc
val CONVERT_METASTORE_ORC = buildConf("spark.sql.hive.convertMetastoreOrc")
.doc("When set to true, the built-in ORC reader and writer are used to process " +
"ORC tables created by using the HiveQL syntax, instead of Hive serde.")
.booleanConf
.createWithDefault(true)
Parquet
val CONVERT_METASTORE_PARQUET = buildConf("spark.sql.hive.convertMetastoreParquet")
.doc("When set to true, the built-in Parquet reader and writer are used to process " +
"parquet tables created by using the HiveQL syntax, instead of Hive serde.")
.booleanConf
.createWithDefault(true)
我也遇到了这种具有多个内部和外部表连接的问题。
这些技巧都不起作用,包括:
spark.sql("set spark.sql.hive.convertMetastoreParquet=false")
spark.sql("set spark.sql.hive.metastorePartitionPruning=true")
spark.sql("set spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER")
任何知道如何解决这个问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.