重新分配后是否需要缓存

时间:2016-07-12 14:24:59

标签: caching apache-spark

我已经根据节点上的主键

重新分配了数据帧
val config=new SparkConf().setAppName("MyHbaseLoader").setMaster("local[10]")
val context=new SparkContext(config)
val sqlContext=new SQLContext(context)
val rows="sender,time,time(utc),reason,context-uuid,rat,cell-id,first-pkt,last-pkt,protocol,sub-proto,application-id,server-ip,server-domain-name, http-proxy-ip,http-proxy-domain-name, video,packets-dw, packets-ul, bytes-dw, bytes-ul"
val scheme= new StructType(rows.split(",").map(e=>new StructField(e.trim,StringType,true)))
val dFrame=sqlContext.read
  .schema(scheme)
  .format("csv")
  .load("E:\\Users\\Mehdi\\Downloads\\ProbDocument\\ProbDocument\\ggsn_cdr.csv")

dFrame.registerTempTable("GSSN")
dFrame.persist(StorageLevel.MEMORY_AND_DISK)

val distincCount=sqlContext.sql("select count(distinct sender) as SENDERS from GSSN").collectAsList().get(0).get(0).asInstanceOf[Long]
dFrame.repartition(distincCount.toInt/3,dFrame("sender"))

在数据帧上重新分配下一个减少作业后,是否需要再次调用我的预先方法?

3 个答案:

答案 0 :(得分:0)

是的,repartition会返回一个新的DataFrame,因此您需要再次cache

答案 1 :(得分:0)

虽然Dikei提供的答案似乎解决了您的直接问题,但重要的是要注意,在这种情况下,通常没有理由明确缓存。

Spark中的每次shuffle(此处为repartition)都充当隐式缓存点。如果必须重新执行血统的某些部分并且没有任何遗嘱执行者丢失,那么它不会再进一步​​回到最后一次洗牌并读取随机文件。

这意味着在shuffle之前或之后缓存通常是浪费时间和资源,特别是如果您对内存或一些非标准缓存机制不感兴趣。

答案 2 :(得分:0)

您需要保留修复DataFrame,因为DataFrames是不可变的,并且reparation返回一个新的DataFrame。

您可以遵循的方法是持久化dFrame,并在其修复后返回的新DataFrame是dFrameRepart。在此阶段,您可以保留dFrameRepart并取消使用dFrame以释放内存,前提是您不会再次使用dFrame。如果您在修复操作后使用dFrame,则两个DataFrame都可以保留。

dFrame.registerTempTable(" GSSN&#34) dFrame.persist(StorageLevel.MEMORY_AND_DISK)

val distincCount = sqlContext.sql("选择计数(不同的发件人)作为GSSN的SENDERS")。collectAsList()。get(0).get(0).asInstanceOf [Long]

valdFrameRepart = dFrame.repartition(distincCount.toInt / 3,dFrame(" sender"))。persist(StorageLevel.MEMORY_AND_DISK) dFrame.unpersist