[英]spark filtering not working
我正在嘗試過濾我的 Dataframe[Row] 上的一些值。 問題如下:
var index : Int = 0
var set = SetBuilding(features, 3)
val soglia : Int = 30
var exit : Boolean = false
while (!exit && index<set.length){
val attributes = set(index).split(",")
var r = scala.util.Random
var i = r.nextInt(attributes.length)
var previousI = i
var j : Int = 8
var maxprojections : Int = 5
var dataframe = sqlContext.sql("SELECT "+set(index)+" FROM table").cache()
println("**************VALUTAZIONE SOTTOINSIEME: "+ set(index)+"***********************" )
while ( j!=0 && maxprojections >=0){
var filtered = dataframe.filter((elem : Row) => ReturnType(elem.get(elem.fieldIndex(attributes(i)))).>(soglia))
println ( "proiezione su attributo " + attributes (i))
for (elem <- filtered){
println(elem)
}
if ( attributes.size != 1){
do{
i = r.nextInt(attributes.length)
}while ( i == previousI )
}
println ( "*********valore di previousI = "+ attributes(previousI)+ "******************************")
previousI = i
j = filtered.count().toInt
println ( "*********valore di j = "+ j+ "******************************")
maxprojections = maxprojections - 1
println ( "*********valore di maxproj = "+ maxprojections+ "******************************")
}
index+=1
if ( index >= 4)
exit = true
}
問題是,如果我將數據結構保持為 spark.DataFrame 並調用 filter(),在某些屬性上,我希望返回一個空數據框,但調用filteredData.count 的值是 != 0,但我確定這些值小於閾值。
當我對filteredData 調用collect() 時,問題不會發生。
是否有解決方案包括將過濾數據維護為數據幀?
我希望現在查詢是很好的
似乎在問題上下文中的期望是每個filter
操作都會改變Dataframe
有效地Dataframe
刪除元素。
這是一個錯誤的假設。
每個數據幀代表一組不可變的數據。 在循環的每次迭代中,我們都會獲得一個新的數據幀,它是使用單個條件進行過濾的結果。 因此,在每個循環中,結果如下所示:
/** loop 1 **/ var filtered = dataframe.filter(attibute_1 > threshold)
/** loop 2 **/ var filtered = dataframe.filter(attibute_2 > threshold)
...
/** loop n **/ var filtered = dataframe.filter(attibute_n > threshold)
我們在最后觀察到的是最終過濾操作覆蓋變量var filtered = dataframe.filter(attibute_n > threshold)
所有其他過濾操作都丟失了。
如果我們想在這種情況下迭代刪除元素,實現這一目標的快速更改是通過利用可變變量在循環中堆疊過濾器。 像這樣:
var filtered = dataframe
while (cond) {
filtered = filtered.filter(attibute_i > threshold)
}
這里生成的filtered
數據幀有一個邏輯計划,由幾個相互跟隨的過濾操作組成。 它相當於: dataframe.filter(attibute1 > threshold).filter(attribute2 > threshold).filter(attribute3 > threshold)...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.