Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 数据帧的部分垂直缓存_Caching_Apache Spark_Dataframe_Parquet - Fatal编程技术网

Caching 数据帧的部分垂直缓存

Caching 数据帧的部分垂直缓存,caching,apache-spark,dataframe,parquet,Caching,Apache Spark,Dataframe,Parquet,我用火花拼花地板。 我希望能够缓存我们最常用于过滤的列,同时将另一列保留在磁盘上。 我正在运行类似于: myDataFrame.select("field1").cache myDataFrame.select("field1").count myDataFrame.select("field1").where($"field1">5).count myDataFrame.select("field1", "field2").where($"field1">5).count 第四行

我用火花拼花地板。 我希望能够缓存我们最常用于过滤的列,同时将另一列保留在磁盘上。 我正在运行类似于:

myDataFrame.select("field1").cache
myDataFrame.select("field1").count
myDataFrame.select("field1").where($"field1">5).count
myDataFrame.select("field1", "field2").where($"field1">5).count
第四行不使用缓存


有什么简单的解决方案可以帮上忙吗?

这不会缓存的原因是,每当您对数据帧(如select)进行转换时,实际上是在创建一个新的数据帧。基本上,您所做的是缓存一个只包含field1的数据帧和一个只包含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)
i、 e.cachedDF拥有所有您筛选的字段,然后您进行非常强的筛选,然后执行内部联接(cond是所有相关的选定字段或某个id字段),该联接将提供所有相关数据


也就是说,在大多数情况下,假设您使用拼花地板之类的文件格式,缓存将不会对您有多大帮助。

这不会缓存的原因是,每当您对数据帧(例如选择)进行转换时,您实际上正在创建一个新的数据帧。基本上,您所做的是缓存一个只包含field1的数据帧和一个只包含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)
i、 e.cachedDF拥有所有您筛选的字段,然后您进行非常强的筛选,然后执行内部联接(cond是所有相关的选定字段或某个id字段),该联接将提供所有相关数据


也就是说,在大多数情况下,假设您使用文件格式(如parquet),缓存将不会对您有多大帮助。

谢谢,实际上我是指我在那里写的内容(field1),因为parquet是一种柱状格式,我希望获得缓存,使对磁盘的访问只针对未缓存的字段。虽然join在这里是一个可能的解决方案,但在大多数情况下它会非常昂贵。谢谢,实际上我指的是我在那里写的内容(field1),因为parquet是一种柱状格式,我希望获得缓存,使对磁盘的访问只针对未缓存的字段。虽然join在这里是一种可能的解决方案,但在大多数情况下,它的成本非常高。