我已经根据节点上的主键
重新分配了数据帧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"))
在数据帧上重新分配下一个减少作业后,是否需要再次调用我的预先方法?
答案 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