2016-07-04 16 views
1

ich ein JSON-Dokument in Spark-geladen, grob, es sieht aus wie:Individuelle Verarbeitung auf Spalte in Apache Spark (Java)

df = df.withColumn("desc", df.col("fields.type_description")); 

alles in Ordnung:

root 
|-- datasetid: string (nullable = true) 
|-- fields: struct (nullable = true) 
... 
| |-- type_description: string (nullable = true) 

Mein DF wird es in Dreh , aber type_description 's Wert sieht wie folgt aus: "1 - My description type".

Idealerweise möchte ich, dass mein df nur den Textteil enthält, z. "Meine Beschreibungsart" Ich weiß, wie man das macht, aber wie kann ich es durch Spark schaffen?

Ich hatte gehofft, einige entlang der Linie:

df = df.withColumn("desc", df.col("fields.type_description").call(/* some kind of transformation class/method*/)); 

Dank!

+0

Also was genau suchen Sie? Regexp? Teilzeichenfolge? Könnten Sie die Frage aktualisieren, um das zu berücksichtigen? – zero323

+0

Idealerweise könnte es alles sein ... in dieser Situation würde ich mit einem Teilstring und trim (es gibt nie mehr als 2 Ziffern) ... aber ich habe andere Situationen, die interessanter sind wie Parsing, Verkettung von Werten zwischen den Spalten jorda mal anrufen, etc. – jgp

Antwort

1

Im Allgemeinen bietet Spark eine breite Palette von SQL-Funktionen, die von grundlegenden Funktionen zur Verarbeitung von Zeichenketten über Datum/Uhrzeit-Verarbeitungsfunktionen bis hin zu verschiedenen statistischen Zusammenfassungen reichen. Dies sind Teil von o.a.s.sql.functions. In diesem speziellen Fall möchten Sie wahrscheinlich so etwas wie:

import static org.apache.spark.sql.functions.*; 

df.withColumn("desc", 
    regexp_replace(df.col("fields.type_description"), "^[0-9]*\\s*-\\s*", "") 
); 

Generell sollten diese Funktionen Ihre erste Wahl sein, wenn Sie mit Spark SQL arbeiten. Sie werden von Catalyst-Ausdrücken unterstützt und stellen normalerweise Codegen-Hilfsprogramme bereit. Dies bedeutet, dass Sie von verschiedenen Spark SQL-Optimierungen profitieren können.

Alternative, aber weniger effiziente Methode ist benutzerdefinierte UDF zu implementieren. Siehe zum Beispiel Creating a SparkSQL UDF in Java outside of SQLContext

+1

Awesome - Ich sah, wir könnten UDF mit Python machen, aber ich bin wirklich froh, dass wir das auch mit Java machen können! Tx! – jgp