Apache spark 通过spark执行配置单元查询时返回错误答案
有人愿意冒险猜测一下为什么在Hive和Spark的dataframe API中执行的查询会返回不同的结果(顺便说一下,Hive返回的答案是正确的)Apache spark 通过spark执行配置单元查询时返回错误答案,apache-spark,apache-spark-sql,spark-dataframe,hiveql,Apache Spark,Apache Spark Sql,Spark Dataframe,Hiveql,有人愿意冒险猜测一下为什么在Hive和Spark的dataframe API中执行的查询会返回不同的结果(顺便说一下,Hive返回的答案是正确的) 蜂巢: gb-slo-svb-0019:10000>从sseft.feat\u promo\u prod\u store\u period中选择count(*); 信息->从sseft.feat\u promo\u prod\u store\u period中选择计数(*) _c0 84071294 火花: sqlContext.sql('se
蜂巢:
gb-slo-svb-0019:10000>从sseft.feat\u promo\u prod\u store\u period中选择count(*);
信息->从sseft.feat\u promo\u prod\u store\u period中选择计数(*)
_c0
84071294
火花:
sqlContext.sql('select count(*)from sseft.feat\u promo\u prod\u store\u period').show()
+---+
|_c0|
+---+
| 0|
+---+
有趣的是,如果我使用spark而不是hive表指向底层hdfs位置,我会得到正确的答案:
sqlContext.read.parquet('/Lev4/sse/hive/sseft/feat\u promo\u prod\u store\u period').count()
84071294
此图描述了这三种情况:
检查您的hive-site.xml,它应该复制到spark conf目录,并且应该具有以下配置
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://host.xxx.com:9083</value>
</property>
</configuration>
hive.metastore.uris
thrift://host.xxx.com:9083
确定该行为原因的最简单方法是查看explain()
结果。比较这些:
sqlContext.sql('select * from sseft.feat_promo_prod_store_period').explain()
sqlContext.read.parquet('/Lev4/sse/hive/sseft/feat_promo_prod_store_period').explain()
如果它们不相同,您应该查看表是如何创建的,例如
sqlConext.sql('show create table sseft.feat\u promo\u prod\u store\u period')。first()
这似乎是引发表缓存的元数据的一个问题-该理论基于这样一个事实:删除表并重新创建它解决了问题。不幸的是,我无法重现这个问题,如果我提出了一个修复方案,我会尽量记得回到这里并报告它。