2017-01-03 94 views
1

我使用带镶木地板的火花。 我希望能够缓存我们最常使用的列进行过滤,同时保留其他磁盘。 我运行类似:DataFrame的部分垂直缓存

myDataFrame.select("field1").cache 
myDataFrame.select("field1").count 
myDataFrame.select("field1").where($"field1">5).count 
myDataFrame.select("field1", "field2").where($"field1">5).count 

第四行不使用缓存。

任何简单的解决方案,可以帮助这里?

回答

0

这种不会缓存的原因是,无论何时对数据帧进行转换(例如select),实际上都是在创建一个新数据帧。你基本上做的是缓存一个只包含field1的数据框和一个只包含field1的数据框,它大于5(可能你的意思是说field2在这里,但没关系)。

在第四行上,您将创建第三个数据帧,该数据帧对原始数据帧没有血统,只是原始数据帧。

如果您通常要做强滤波(即你得到一个非常少量的元件),你可以做这样的事情:

cachedDF = myDataFrame.select("field1", "field2", ... "fieldn").cache 
cachedDF.count() 
filteredDF = cachedDF.filter(some strong filter) 
res = myDataFrame.join(broadcast(filteredDF), cond) 

即cachedDF有您筛选上的所有字段,然后您筛选非常强烈然后进行内部连接(cond是所有相关的选定字段或某个id字段),这将提供所有相关数据。

也就是说,在大多数情况下,假设您使用像镶木地板这样的文件格式,高速缓存对您无能为力。

+0

谢谢,实际上我的意思是我在那里写了(field1), ,因为parquet是一种列式格式,我希望获得缓存,只会对未被缓存的字段进行磁盘访问。 虽然连接是一个可能的解决方案,但在大多数情况下,这将是非常昂贵的。 – roee