优化Hive表在Spark中的加载时间

时间:2019-03-21 17:34:34

标签: sql scala apache-spark hive apache-spark-sql

我正在一个Spark Streaming项目中,其中传入流与多个Hive表联接。因此,我将表格加载到spark中并进行缓存。

下面是给定的示例查询-

 val df = sql("select * from (select *, row_number() over (partition by a , b , c, d order by date desc) row_num from test) tmp where tmp.row_num = 1")

表中有99%的重复数据,所以我使用行号逻辑来区分。当我执行df.explain(true)时,下推式没有任何条件。因此整个表都加载到内存中。该表包含数十亿数据。这会导致FAILED_TO_UNCOMPRESS(5)错误。

我应该使用上面的查询创建Hive视图,并在spark中调用该视图,以便它获取结果数据。我不知道是否行得通。

大约有10张桌子每15分钟加载一次火花。全部具有相同的行号逻辑。如何启用下推式?因此spark只能从Hive获取结果数据。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用 MAX 函数代替 ROW_NUM ?使用ROW_NUM可能是问题所在。我将使用以下查询:

val df = sql("select *, MAX(date) over (partition by a , b , c, d) from test")

有关更多详细信息,请参见MAX function definition