Comment concaténer deux colonnes dans un DataFrame Apache Spark? Existe-t-il une fonction dans Spark SQL que nous pouvons utiliser?
116
Comment concaténer deux colonnes dans un DataFrame Apache Spark? Existe-t-il une fonction dans Spark SQL que nous pouvons utiliser?
Avec le SQL brut, vous pouvez utiliser CONCAT
:
En Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Dans 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")
Depuis Spark 1.5.0, vous pouvez utiliser la concat
fonction avec l'API DataFrame:
En Python:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
Dans Scala:
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Il existe également une concat_ws
fonction qui prend un séparateur de chaîne comme premier argument.
Voici comment vous pouvez attribuer un nom personnalisé
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()
donne,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
créer une nouvelle colonne en concaténant:
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
crée une colonne de_
Une option pour concaténer les colonnes de chaînes dans Spark Scala utilise
concat
.Il est nécessaire de vérifier les valeurs nulles . Parce que si l'une des colonnes est nulle, le résultat sera nul même si l'une des autres colonnes contient des informations.
Utilisation
concat
etwithColumn
:Utilisation
concat
etselect
:Avec les deux approches, vous aurez un NEW_COLUMN dont la valeur est une concaténation des colonnes: COL1 et COL2 de votre df d'origine.
la source
concat_ws
place deconcat
, vous pouvez éviter de vérifier NULL.Si vous souhaitez le faire en utilisant DF, vous pouvez utiliser un udf pour ajouter une nouvelle colonne basée sur des colonnes existantes.
la source
Depuis Spark 2.3 ( SPARK-22771 ) Spark SQL prend en charge l'opérateur de concaténation
||
.Par exemple;
la source
Voici une autre façon de faire cela pour pyspark:
la source
Voici une suggestion lorsque vous ne connaissez pas le nombre ou le nom des colonnes dans le Dataframe.
la source
concat (* cols)
v1.5 et supérieur
Concatène plusieurs colonnes d'entrée en une seule colonne. La fonction fonctionne avec des chaînes, des colonnes binaires et des tableaux compatibles.
Par exemple:
new_df = df.select(concat(df.a, df.b, df.c))
concat_ws (sep, * cols)
v1.5 et supérieur
Similaire à
concat
mais utilise le séparateur spécifié.Par exemple:
new_df = df.select(concat_ws('-', df.col1, df.col2))
map_concat (* cols)
v2.4 et supérieur
Utilisé pour concater des cartes, renvoie l'union de toutes les cartes données.
Par exemple:
new_df = df.select(map_concat("map1", "map2"))
Utilisation de l'opérateur de chaîne concat (
||
):v2.3 et supérieur
Par exemple:
df = spark.sql("select col_a || col_b || col_c as abc from table_x")
Référence: Spark sql doc
la source
Dans Spark 2.3.0, vous pouvez faire:
la source
En Java, vous pouvez le faire pour concaténer plusieurs colonnes. L'exemple de code est de vous fournir un scénario et comment l'utiliser pour une meilleure compréhension.
Le code ci-dessus concaténé col1, col2, col3 séparés par "_" pour créer une colonne avec le nom "concatenatedCol".
la source
Avons-nous la syntaxe Java correspondant au processus ci-dessous
la source
Une autre façon de le faire dans pySpark en utilisant sqlContext ...
la source
En effet, il existe de belles abstractions intégrées pour que vous puissiez accomplir votre concaténation sans avoir besoin d'implémenter une fonction personnalisée. Depuis que vous avez mentionné Spark SQL, je suppose que vous essayez de le passer en tant que commande déclarative via spark.sql (). Si tel est le cas, vous pouvez effectuer de manière simple en passant une commande SQL comme:
SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;
De plus, à partir de Spark 2.3.0, vous pouvez utiliser des commandes en lignes avec:
SELECT col1 || col2 AS concat_column_name FROM <table_name>;
Où, est votre délimiteur préféré (peut également être un espace vide) et est la table temporaire ou permanente que vous essayez de lire.
la source
Nous pouvons également utiliser simplement SelectExpr. df1.selectExpr ("*", "supérieur (_2 || _3) comme nouveau")
la source