簡體   English   中英

火花過濾不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM