2015-08-04 24 views
13

Lot yapı elemanları içeren karmaşık JSON veri kümesi için filtre işlevi yazıyorum. Tek tek sütunları geçmek çok hantal. SezgiselTüm Satır UDF'ye nasıl iletilir - Spark DataFrame süzgeci

val records:DataFrame = = sqlContext.jsonFile("...") 
def myFilterFunction(r:Row):Boolean=??? 
sqlc.udf.register("myFilter", (r:Row)=>myFilterFunction(r)) 

bunun böyle çalışacak düşünüyorum:

records.filter("myFilter(*)=true") 

gerçek sözdizimi nedir

Yani şu UDF ilan?

+0

Eğer filtre işlevi daha biraz belirtebilir misiniz? 'Row' kullanarak' DataFrame' sizin için bir çok optimizasyon atar. – Reactormonk

+0

Filtre oldukça karmaşıktır. Kaydın yapısı, içlerindeki anahtar-değer çiftleri içeren birkaç Harita alanıdır. –

cevap

16

İşlev çağrısı yaparken satırı oluşturmak için struct() işlevini kullanmanız gerekir, aşağıdaki adımları izleyin.

İthalat Row,

import org.apache.spark.sql._ 

UDF

def myFilterFunction(r:Row) = {r.get(0)==r.get(1)} 

tanımlayın UDF

sqlContext.udf.register("myFilterFunction", myFilterFunction _) 

Kayıt dataFrame

val records = sqlContext.createDataFrame(Seq(("sachin", "sachin"), ("aggarwal", "aggarwal1"))).toDF("text", "text2") 
012 oluştur

Kullanım UDF

records.filter(callUdf("myFilterFunction",struct($"text",$"text2"))).show 

u tüm sütunlar UDF geçirilecek istiyorum

.

records.filter(callUdf("myFilterFunction",struct(records.columns.map(records(_)) : _*))).show 

Sonuç:

+------+------+ 
| text| text2| 
+------+------+ 
|sachin|sachin| 
+------+------+ 
+0

Bu yardımcı olur. İhtiyacım olan% 100 değil, daha iyi bir alternatif. –

+0

, lütfen% 100 yapmak için kaçırdıklarımı ayrıntılı olarak anlatayım, öneriyi ur gereksinimlerine göre güncellemeye çalışacağım. – agsachin

+0

ideali, sütunları listelemek zorunda kalmamakta, ancak bir şekilde tüm satırdan bahsedecektir. –

İlgili konular