apachespark没有使用hive分区的外部表中的分区信息

ycggw6v2  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(437)

我有一个简单的配置单元外部表,它是在s3之上创建的(文件是csv格式的)。当我运行配置单元查询时,它会显示所有记录和分区。
但是,当我在spark中使用同一个表时(spark sql在分区列上有where条件),并没有显示应用了分区过滤器。但是对于配置单元管理的表,spark能够使用分区信息并应用分区过滤器。
是否有任何标志或设置可以帮助我使用spark中配置单元外部表的分区?谢谢。



更新:
由于某些原因,只有spark计划没有显示分区过滤器。但是,当您查看加载的数据时,它只从分区加载所需的数据。
例如:如果rating=0,只加载一个1 mb的文件,当我没有筛选器时,它读取3个分区的所有3 mb

eivgtgni

eivgtgni1#

热释光;dr在运行外部表的sql之前设置了以下内容 spark.sql("set spark.sql.hive.convertMetastoreOrc=true") 行为上的差异不是因为extnal/managed表。
这种行为取决于两个因素
1.创建表的位置(配置单元或spark)
2.文件格式(我相信这是orc在这个例子中,从截屏)

创建表的位置(配置单元或spark)

如果该表是使用spark API创建的,则将其视为数据源表。
如果该表是用usng hiveql创建的,则将其视为配置单元本机表。
这两个表的元数据都存储在hive metastore中,唯一的区别在于 provider 领域 TBLPROPERTIES table的位置( describe extended <tblName> ). 财产的价值是 orc 或空在Spark表和 hive 为了Hive。

spark如何使用这些信息

当提供程序不是 hive (datasource表),spark使用其本机方式处理数据。
如果提供程序是 hive ,spark使用配置单元代码来处理数据。

文件格式

spark给出config标志,指示引擎使用datasource方法处理floowing文件格式的数据= Orc 以及 Parquet 旗帜:

兽人

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)

相关问题