同一外部表上的Count(*)在spark.sql()和hive中给出不同的值

时间:2019-04-27 16:52:42

标签: apache-spark hive pyspark

我正在使用hive和spark进行AWS集群开发。前一天,我在Hive的外部表上运行一些ETL pyspark脚本时遇到了一种奇怪的情况。

我们有一个控制表,其中有一个提取日期列。然后,我们根据提取日期从暂存表(配置单元中的托管表,但位置为s3存储桶)中筛选数据,并将其加载到目标表中,该目标表是数据位于s3存储桶中的外部表。我们正在加载如下表

spark.sql("INSERT OVERWRITE target_table select * from DF_made_from_stage_table")

现在,当我通过spark和直接配置单元CLI检查目标表的count(*)时,两者都给出不同的计数

火花:

 spark.sql("select count(1) from target") -- giving 50K records

在配置单元中:

 select count(1) from target -- giving a count 50k - 100 

注意:外部表的统计信息出现了间歇性问题,它在蜂巢中的计数为-1。我们通过运行

解决了这一问题
ANALYZE TABLE target COMPUTE STATISTICS

但是即使完成所有这些操作,我们仍然在蜂巢中获得了original_count-100,其中正确计数了火花。

1 个答案:

答案 0 :(得分:0)

用于外部表的DDL中有一个错误。 DDL中存在“ skip.header.line.count” =“ 1”,我们有100个输出文件。因此,跳过了每个文件1行,这导致原始计数-蜂巢中为100,而spark正确地计算了它。现在已删除“ skip.header.line.count” =“ 1”及其提供的计数。