为了提高性能(例如对于联接),建议首先计算表静态。
在 hive 里我能做到:
analyze table <table name> compute statistics;
在 Impala :
compute stats <table name>;
我的spark应用程序(从配置单元表读取)是否也受益于预先计算的统计数据?如果是,我需要运行哪一个?他们都在Hive元存储中保存数据吗?我在cloudera 5.5.4上使用spark 1.6.1
注:spark 1.6.1文件中(https://spark.apache.org/docs/1.6.1/sql-programming-guide.html)对于参数 spark.sql.autoBroadcastJoinThreshold
我发现了一个提示:
请注意,当前统计信息仅支持已运行命令analyze table compute statistics noscan的配置单元元存储表。
3条答案
按热度按时间r6hnlfcb1#
我假设您使用的是spark上的配置单元(或)spark sql和配置单元上下文。如果是这样,您应该在配置单元中运行analyze。
analyze table<…>通常需要在创建表之后运行,或者如果有重要的插入/更改。如果这是mr或spark作业,您可以在加载步骤结束时自己执行此操作。
在分析时,如果您使用的是spark上的配置单元-请同时使用下面链接中的配置。您可以在会话级别为每个查询设置此选项。我使用了这个链接中的参数https://cwiki.apache.org/confluence/display/hive/hive+on+spark%3a+getting+started 在生产和它的工作良好。
vsnjm48y2#
据我所知,impala上的computestats是最新的实现,它使您不必调整配置单元设置。
来自官方文件:
如果使用基于配置单元的方法来收集统计信息,请参阅配置单元wiki以获取有关配置单元端所需配置的信息。cloudera建议使用impala compute stats语句来避免统计数据收集过程中潜在的配置和可伸缩性问题。
如果运行配置单元语句analyze table compute statistics for columns,impala只能在表未分区的情况下使用生成的列统计信息。impala不能对分区表使用配置单元生成的列统计信息。
有用链接:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_perf_stats.html
rseugnpd3#
这是即将发布的spark2.3.0(可能有些特性已经在2.2.1或更早版本中发布)。
我的spark应用程序(从配置单元表读取)是否也受益于预先计算的统计数据?
如果impala或hive在spark可以读取的表元数据的hive metastore中记录了表统计信息(例如表大小或行计数)(并将其转换为自己的spark统计信息以进行查询规划),则可能会发生这种情况。
你可以使用
DESCRIBE EXTENDED
中的sql命令spark-shell
.