Spark的数据集api与Dataframe相比给出了不同的结果

时间:2017-06-02 18:40:32

标签: java scala apache-spark apache-spark-sql spark-dataframe

我正在使用Spark 2.1并且有一个带有orc格式的hive表,以下是架构。

position    DiffValue
   7            X
   11           X
   15           -

当我使用分区列在此表的顶部应用过滤器时,它工作正常并且只读取特定分区。

col_name    data_type
tuid        string
puid        string
ts          string
dt          string
source      string
peer        string
# Partition Information 
# col_name  data_type
dt          string
source      string
peer        string

# Detailed Table Information    
Database:           test
Owner:              test
Create Time:        Tue Nov 22 15:25:53 GMT 2016
Last Access Time:   Thu Jan 01 00:00:00 GMT 1970
Location:           hdfs://apps/hive/warehouse/nis.db/dmp_puid_tuid
Table Type:         MANAGED
Table Parameters:   
  transient_lastDdlTime 1479828353
  SORTBUCKETCOLSPREFIX  TRUE

# Storage Information   
SerDe Library:  org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat:    org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat:   org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Compressed: No
Storage Desc Parameters:    
  serialization.format  1

这是我对此查询的实际计划

val puid = spark.read.table("nis.dmp_puid_tuid")
    .as(Encoders.bean(classOf[DmpPuidTuid]))
    .filter( """peer = "AggregateKnowledge" and dt = "20170403"""")

但是当我使用下面的代码时,它将整个数据读入spark

== Physical Plan ==
HiveTableScan [tuid#1025, puid#1026, ts#1027, dt#1022, source#1023, peer#1024], MetastoreRelation nis, dmp_puid_tuid, [isnotnull(peer#1024), isnotnull(dt#1022), 
(peer#1024 = AggregateKnowledge), (dt#1022 = 20170403)]

上述数据框的实际计划

val puid = spark.read.table("nis.dmp_puid_tuid")
    .as(Encoders.bean(classOf[DmpPuidTuid]))
    .filter( tp => tp.getPeer().equals("AggregateKnowledge") && Integer.valueOf(tp.getDt()) >= 20170403)

注意: - DmpPuidTuid 是java bean类

1 个答案:

答案 0 :(得分:0)

当您将Scala函数传递给filter时,可以阻止Spark优化器查看实际使用的数据集的哪些列(因为优化器不会尝试查看函数的已编译代码)。如果传递列表达式(例如col("peer") === "AggregateKnowledge" && col("dt").cast(IntegerType) >= 20170403),则优化程序将能够查看实际需要哪些列并相应地调整计划。