Benutzerdefinierte Funktionen (UDF) helfen kann, ist, was Sie brauchen. Angenommen, Sie haben folgende Eingabe:
case class Data(url: String)
val urls = sqlContext.createDataFrame(Seq(Data("http://google.com/q=dfsdf"), Data("https://fb.com/gsdgsd")))
urls.registerTempTable("urls")
Jetzt können Sie UDF definieren, die nur den Hostnamen aus URL bekommt:
def getHost(url: String) = url.split('/')(2) //naive implementation, for example only
sqlContext.udf.register("getHost", getHost _)
und erhalten Sie Ihre Daten transformiert mit SQL:
val hosts = sqlContext.sql("select getHost(url) as host from urls")
hosts.show()
Ergebnis:
+----------+
| host|
+----------+
|google.com|
| fb.com|
+----------+
I f Sie Scala DSL bevorzugen, können Sie Ihre UDF verwenden:
import org.apache.spark.sql.functions.udf
val getHostUdf = udf(getHost _)
val urls = urls.select(getHostUdf($"url") as "host")
Ergebnis wird genau das gleiche.
Danke funktioniert perfekt. – knox