2017-09-15 68 views
3

我的問題是我必須在列表中找到這些不是空的。當我使用過濾器功能不是空的,比我得到的每一行。在非空WrappedArray上過濾數據幀

我的程序代碼如下所示:

...  
val csc = new CassandraSQLContext(sc) 
val df = csc.sql("SELECT * FROM test").toDF() 

val wrapped = df.select("fahrspur_liste") 
wrapped.printSchema 

fahrspur_liste包含包裹陣列和本專欄我來分析。當我運行的代碼,比我得到這個結構,我的包裹陣列和這些條目:

root 
|-- fahrspur_liste: array (nullable = true) 
| |-- element: long (containsNull = true) 

+--------------+ 
|fahrspur_liste| 
+--------------+ 
|   []| 
|   []| 
|   [56]| 
|   []| 
|   [36]| 
|   []| 
|   []| 
|   [34]| 
|   []| 
|   []| 
|   []| 
|   []| 
|   []| 
|   []| 
|   []| 
|   [103]| 
|   []| 
|   [136]| 
|   []| 
|   [77]| 
+--------------+ 
only showing top 20 rows 

現在我要過濾這些行,讓我只有條目[56],[36],[ 34],[103],...

我該如何編寫一個過濾器函數,我只得到這些行,其中包含一個數字?

+0

可以通過定義用戶在火花定義函數實現這一點。一個用於測試數組是否爲空,另一個用於測試數組是否包含某些內容。 – dumitru

回答

1

你可以用火花中的udf來做到這一點。簡單例子:

val spark = SparkSession.builder.getOrCreate() 
import spark.implicits._ 

val df = spark.sparkContext.parallelize(Seq(Seq(123L), Seq(456L), Seq(), Seq())) 
    .toDF("fahrspur_liste") 
df.show() 

+--------------+ 
|   [123]| 
|   [456]| 
|   []| 
|   []| 
+--------------+ 

val removeEmpty = udf((array: Seq[Long]) => !array.isEmpty) 

val df2 = df.filter(removeEmpty($"fahrspur_liste")) 
df2.show() 

+--------------+ 
|fahrspur_liste| 
+--------------+ 
|   [123]| 
|   [456]| 
+--------------+ 

這裏udf檢查該數組爲空或沒有。過濾器函數將刪除那些返回爲真的。

+1

謝謝。這解決了我的問題! – DaShI

4

我不認爲你需要在這裏使用UDF。

可以只使用size方法和與陣列尺寸過濾所有那些行= 0

df.filter(""" size(fahrspur_liste) != 0 """)