2017-04-18 104 views
1

我正在使用spark-shell和Scala。是否有可能從shell的內存命名空間中刪除一個變量?Spark:如何從spark-shell內存命名空間中刪除特定變量?

例如,如果我創建這樣的變量:

val foo = 1 
var bar = 2 

是否可以刪除存儲foobar

我知道在Python(使用del)和R(使用rm)中,可以從命名空間(又名環境或工作空間)中刪除特定的變量。

+0

假設你正在簡化的問題,我認爲這取決於你想刪除的內容。請參閱下面的一個答案下面的評論。所以如果你想刪除一個RDD而不是一個Int ...,並且你已經從RDD創建了你想刪除的其他RDD ...我認爲你可能會更好地緩存後續的RDD和.unpersist()原本的。即'val rdd = ???; val rdd2 = rdd.map(???)。cache; rdd.unpersist()' – kmh

回答

3

不幸的是,您無法刪除Scala REPL中的特定變量。你可以做的是分配一個新的值來覆蓋現有的變量。 Scala REPL還提供一個命令:reset來刪除所有變量。

[1]調查內存泄漏星火殼牌:https://gist.github.com/dragos/77b048c2baba93d36cd8

+0

確實分配了一個新的值來完成目標?看到這個例子:'val x = 1; def xx = x + 1; val x = 99; print(xx)'即使在爲x賦一個新的值後,repl掛在舊的val x上以評估def xx,所以現在如果你用x定義了其他任何東西,那麼你會同時使用舊的和x的新值?如果x是一個RDD,或者任何大的,你用它來構建任何其他變量,我想這可能不是你想要的。 – kmh

+0

1.您不能在同一個命令中定義相同的變量。 2.在不同的命令中重新分配將保留內存中的舊值和新值。 – zsxwing

+0

最初的問題是關於刪除變量......我提到的這個問題的用例特別是關於刪除RDD ......但如果任何東西引用了原文,那麼分配一個新值將保留兩個,這可能不會完成因爲沒有很多變量的目標是孤立定義的。在我的情況下,我認爲.unpersist()會做到這一點,但它似乎並沒有。我不得不將數據存入S3,重新啓動shell並重新讀取它以清理內存。 (相同的命令問題,應該是4個命令,但可能更好的約定來放置註釋?) – kmh