2017-09-27 1 views
0

ich das SchemaAnwenden einer strukturerhalt UDF auf eine Säule von structs in einem Datenrahmen

|-- count: struct (nullable = true) 
| |-- day1: long (nullable = true) 
| |-- day2: long (nullable = true) 
| |-- day3: long (nullable = true) 
| |-- day4: long (nullable = true) 
|-- key: string (nullable = true) 

haben, und ich möchte eine Transformation auf den Daten tun, so dass die Struktur der count erhalten bleibt, das heißt, Es hat immer noch vier Felder (Tag1, Tag2, ...) vom Typ long. Die Transformation, die ich durchführen möchte, ist der Wert von day1 Feld zu den anderen Feldern hinzufügen. Meine Idee war, eine UDF zu verwenden, aber ich bin mir nicht sicher, wie 1) das UDF eine Struktur mit der gleichen Struktur und 2) wie innerhalb der UDF auf die Felder der Struktur, die es transformiert (um Holen Sie sich den Wert des Feldes day1). Die Logik für die UDF sollte einfach sein, so etwas wie

s : StructType => StructType(s.day1, s.day1+s.day2, s.day1+s.day3,s.day1+s.day4) 

aber ich weiß nicht, wie die richtigen Typen zu bekommen/die Feldnamen der ursprünglichen Struktur erhalten. Ich bin sehr neu in Spark, so dass jede Anleitung sehr geschätzt wird.

Auch ich würde es sehr schätzen, wenn mir jemand auf die richtige Dokumentation für diese Art von Sache hinweisen könnte. Ich finde, dass diese Art der einfachen Transformation sehr einfach sein sollte, aber ich las die Spark-Dokumente und es war mir nicht klar, wie das gemacht wird.

Antwort

1

Ich würde udf nicht verwenden. Nur select/withColumn

import org.apache.spark.sql.functions._ 
import spark.implicits._ 

df.withColumn("count", 
    struct(
    $"count.day1".alias("day1"), 
    ($"count.day1" + $"count.day2").alias("day2"), 
    ($"count.day1" + $"count.day3").alias("day3"), 
    ($"count.day1" + $"count.day4").alias("day4"))) 
Verwandte Themen