我正在尝试在Spark 2.0中使用Spark SQL模块。
运行Spark SQL Join查询时出现OutOfMemory Exception。 这些是我的问题细节:
我为testing.schema生成了两个表(排名和用户访问,保存为txt文件),如下所示
rankings(
pageURL STRING,
pageRank INT,
avgDuration INT )
uservisits (
sourceIP STRING,
destURL STRING,
visitDate STRING,
adRevenue DOUBLE,
userAgent STRING,
countryCode STRING,
languageCode STRING,
searchWord STRING,
duration INT )
排名有10000列,uservisits有15000000列。 uservisits是偏斜数据,70%的记录在desURL字段中具有相同的值
当我使用Join命令时如下
SELECT pagerank,sourceIP ,pageURL ,adrevenue
from **uservisits**
INNER JOIN **rankings**
ON pageURL=destURL
order by adrevenue desc
它成功运行无例外。
但是当我交换两个这样的表(排名和用户访问被交换)时:
SELECT pagerank,sourceIP ,pageURL ,adrevenue
from **rankings**
INNER JOIN **uservisits**
ON pageURL=destURL
order by adrevenue desc
发生了异常。java.lang.OutOfMemoryError:超出GC开销限制
之后,我做了一些像这样的连接查询测试,看起来对于偏斜的数据,小表连接大表会得到异常,但是大表加入小表赢了。
我对此感到困惑。谁能告诉我为什么会出现这些问题?谢谢!