PySpark 2:KMeans输入数据不直接缓存

时间:2016-11-03 16:01:03

标签: python apache-spark pyspark apache-spark-sql k-means

我不知道为什么收到消息

WARN KMeans: The input data is not directly cached, which may hurt performance if its parent RDDs are also uncached.

当我尝试使用Spark KMeans

df_Part = assembler.transform(df_Part)    
df_Part.cache()
while (k<=max_cluster) and (wssse > seuilStop):
                    kmeans = KMeans().setK(k)
                    model = kmeans.fit(df_Part)
                    wssse = model.computeCost(df_Part)
                    k=k+1

它说我的输入(Dataframe)没有缓存!!

我尝试打印df_Part.is_cached并收到True,这意味着我的数据帧被缓存了,那么为什么Spark仍然警告我这个呢?

2 个答案:

答案 0 :(得分:5)

此消息由o.a.s.mllib.clustering.KMeans生成,如果不修补Spark代码,您就无法真正了解它。

内部o.a.s.ml.clustering.KMeans

  • DataFrame转换为RDD[o.a.s.mllib.linalg.Vector]
  • 执行o.a.s.mllib.clustering.KMeans

在缓存DataFrame时,内部使用的RDD不会被缓存。这就是你看警告的原因。虽然令人讨厌,但我并不担心它。

答案 1 :(得分:2)

这已在Spark 2.2.0中修复。这是Spark-18356

那里的讨论也表明这不是什么大问题,但修复可能会略微减少运行时间,并避免警告。