我有一个简单的配置单元外部表,它是在s3之上创建的(文件是csv格式的)。当我运行配置单元查询时,它会显示所有记录和分区。
但是,当我在spark中使用同一个表时(spark sql在分区列上有where条件),并没有显示应用了分区过滤器。但是对于配置单元管理的表,spark能够使用分区信息并应用分区过滤器。
是否有任何标志或设置可以帮助我使用spark中配置单元外部表的分区?谢谢。
更新:
由于某些原因,只有spark计划没有显示分区过滤器。但是,当您查看加载的数据时,它只从分区加载所需的数据。
例如:如果rating=0,只加载一个1 mb的文件,当我没有筛选器时,它读取3个分区的所有3 mb
1条答案
按热度按时间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
旗帜:兽人
parquet