Wie verketten wir zwei Spalten in einem Apache Spark DataFrame? Gibt es eine Funktion in Spark SQL, die wir verwenden können?
115
Wie verketten wir zwei Spalten in einem Apache Spark DataFrame? Gibt es eine Funktion in Spark SQL, die wir verwenden können?
Mit Raw SQL können Sie Folgendes verwenden CONCAT
:
In Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
In der Scala
import sqlContext.implicits._
val df = sc.parallelize(Seq(("foo", 1), ("bar", 2))).toDF("k", "v")
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Seit Spark 1.5.0 können Sie concat
Funktionen mit der DataFrame-API verwenden:
In Python:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
In Scala:
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Es gibt auch eine concat_ws
Funktion, die ein String-Trennzeichen als erstes Argument verwendet.
Hier erfahren Sie, wie Sie benutzerdefinierte Namen erstellen können
import pyspark
from pyspark.sql import functions as sf
sc = pyspark.SparkContext()
sqlc = pyspark.SQLContext(sc)
df = sqlc.createDataFrame([('row11','row12'), ('row21','row22')], ['colname1', 'colname2'])
df.show()
gibt,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
Erstellen Sie eine neue Spalte, indem Sie Folgendes verketten:
df = df.withColumn('joined_column',
sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
df.show()
+--------+--------+-------------+
|colname1|colname2|joined_column|
+--------+--------+-------------+
| row11| row12| row11_row12|
| row21| row22| row21_row22|
+--------+--------+-------------+
lit
erstellt eine Spalte von_
Eine Option zum Verketten von Zeichenfolgenspalten in Spark Scala ist die Verwendung
concat
.Es ist notwendig, nach Nullwerten zu suchen . Wenn eine der Spalten null ist, ist das Ergebnis auch dann null, wenn eine der anderen Spalten Informationen enthält.
Verwenden von
concat
undwithColumn
:Verwenden von
concat
undselect
:Bei beiden Ansätzen erhalten Sie eine NEW_COLUMN, deren Wert eine Verkettung der Spalten COL1 und COL2 aus Ihrem ursprünglichen df ist.
quelle
concat_ws
anstelle von verwendenconcat
, können Sie vermeiden, nach NULL zu suchen.Wenn Sie dies mit DF tun möchten, können Sie ein udf verwenden, um eine neue Spalte basierend auf vorhandenen Spalten hinzuzufügen.
quelle
Ab Spark 2.3 ( SPARK-22771 ) unterstützt Spark SQL den Verkettungsoperator
||
.Beispielsweise;
quelle
Hier ist eine andere Möglichkeit, dies für pyspark zu tun:
quelle
Hier ist ein Vorschlag, wenn Sie die Anzahl oder den Namen der Spalten im Datenrahmen nicht kennen.
quelle
concat (* cols)
v1.5 und höher
Verkettet mehrere Eingabespalten zu einer einzigen Spalte. Die Funktion arbeitet mit Zeichenfolgen, binären und kompatiblen Array-Spalten.
Z.B:
new_df = df.select(concat(df.a, df.b, df.c))
concat_ws (sep, * cols)
v1.5 und höher
Ähnlich wie
concat
, verwendet jedoch das angegebene Trennzeichen.Z.B:
new_df = df.select(concat_ws('-', df.col1, df.col2))
map_concat (* cols)
v2.4 und höher
Wird zum Konzentrieren von Karten verwendet und gibt die Vereinigung aller angegebenen Karten zurück.
Z.B:
new_df = df.select(map_concat("map1", "map2"))
Verwenden des String Concat Operators (
||
):v2.3 und höher
Z.B:
df = spark.sql("select col_a || col_b || col_c as abc from table_x")
Referenz: Spark SQL-Dokument
quelle
In Spark 2.3.0 können Sie Folgendes tun:
quelle
In Java können Sie dies tun, um mehrere Spalten zu verketten. Der Beispielcode soll Ihnen ein Szenario und dessen Verwendung zum besseren Verständnis liefern.
Der obige Code verkettet col1, col2, col3 durch "_", um eine Spalte mit dem Namen "concatenatedCol" zu erstellen.
quelle
Haben wir eine Java-Syntax, die dem folgenden Prozess entspricht?
quelle
Eine andere Möglichkeit, dies in pySpark mit sqlContext zu tun ...
quelle
In der Tat gibt es einige schöne eingebaute Abstraktionen, mit denen Sie Ihre Verkettung durchführen können, ohne eine benutzerdefinierte Funktion implementieren zu müssen. Da Sie Spark SQL erwähnt haben, versuchen Sie vermutlich, es als deklarativen Befehl über spark.sql () zu übergeben. In diesem Fall können Sie den SQL-Befehl wie folgt auf einfache Weise übergeben:
SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;
Ab Spark 2.3.0 können Sie außerdem Befehle in folgenden Zeilen verwenden:
SELECT col1 || col2 AS concat_column_name FROM <table_name>;
Dabei handelt es sich um Ihr bevorzugtes Trennzeichen (kann auch ein leerer Bereich sein) und um die temporäre oder permanente Tabelle, aus der Sie lesen möchten.
quelle
Wir können auch einfach SelectExpr verwenden. df1.selectExpr ("*", "obere (_2 || _3) wie neu")
quelle