2016-01-05 13 views
5

Załóżmy, że mamy DataFrame SparkJak zastosować funkcję do kolumny w Spark DataFrame?

df.getClass 
Class[_ <: org.apache.spark.sql.DataFrame] = class org.apache.spark.sql.DataFrame 

z następującym schematem

df.printSchema 
root 
|-- rawFV: string (nullable = true) 
|-- tk: array (nullable = true) 
| |-- element: string (containsNull = true) 

Zważywszy, że każdy wiersz kolumny tk jest tablicą ciągów, jak napisać funkcję Scala, który będzie zwrócić liczbę elementów w każdym rzędzie?

Odpowiedz

10

Nie trzeba napisać funkcję niestandardową, ponieważ jest jedna:

import org.apache.spark.sql.functions.size 

df.select(size($"tk")) 

Jeśli naprawdę chcesz, możesz napisać udf:

import org.apache.spark.sql.functions.udf 

val size_ = udf((xs: Seq[String]) => xs.size) 

lub nawet tworzyć niestandardowe wyrażenie ale naprawdę nie ma na to żadnego znaczenia.

+0

Idealny! Ogólnie rzecz biorąc, chciałbym wiedzieć, jak zastosować UDF do ramek danych. Czy możesz wskazać mi prosty przykład? – ranlot

+0

Istnieją dziesiątki przykładów na SO ([kilka przykładów] (https://stackoverflow.com/search?q=user%3A1560062+import+org.apache.spark.sql.functions.udf+ [apache-spark])) i jak zawsze źródło (szczególnie testy) są dobrym miejscem do rozpoczęcia. – zero323

+0

Jak skorzystasz z tej funkcji size_? – ranlot

1

Jednym ze sposobów jest uzyskanie do nich dostępu za pomocą sql jak poniżej.

df.registerTempTable("tab1") 
val df2 = sqlContext.sql("select tk[0], tk[1] from tab1") 

df2.show() 

Aby uzyskać rozmiaru kolumny tablicy,

val df3 = sqlContext.sql("select size(tk) from tab1") 
df3.show() 

Jeśli wersja Spark jest starszy, można użyć HiveContext zamiast Sparka SQL kontekstu.

Chciałbym również spróbować czegoś, co przemierza.

Powiązane problemy