Como concatenamos duas colunas em um Apache Spark DataFrame? Existe alguma função no Spark SQL que possamos usar?
117
Como concatenamos duas colunas em um Apache Spark DataFrame? Existe alguma função no Spark SQL que possamos usar?
Com o SQL bruto, você pode usar CONCAT
:
Em Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Em 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")
Desde o Spark 1.5.0, você pode usar a concat
função com DataFrame API:
Em Python:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
Em Scala:
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Também há uma concat_ws
função que recebe um separador de string como primeiro argumento.
Veja como você pode fazer nomes personalizados
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()
dá,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
crie uma nova coluna concatenando:
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
cria uma coluna de_
Uma opção para concatenar colunas de string no Spark Scala é usar
concat
.É necessário verificar os valores nulos . Porque se uma das colunas for nula, o resultado será nulo mesmo se uma das outras colunas tiver informações.
Usando
concat
ewithColumn
:Usando
concat
eselect
:Com ambas as abordagens, você terá um NEW_COLUMN cujo valor é uma concatenação das colunas: COL1 e COL2 de seu df original.
fonte
concat_ws
vez deconcat
, pode evitar a verificação de NULL.Se você quiser fazer isso usando DF, pode usar um udf para adicionar uma nova coluna com base nas colunas existentes.
fonte
No Spark 2.3 ( SPARK-22771 ), o Spark SQL oferece suporte ao operador de concatenação
||
.Por exemplo;
fonte
Aqui está outra maneira de fazer isso para o pyspark:
fonte
Aqui está uma sugestão para quando você não sabe o número ou nome das colunas no Dataframe.
fonte
concat (* cols)
v1.5 e superior
Concatena várias colunas de entrada em uma única coluna. A função funciona com strings, colunas binárias e de array compatíveis.
Por exemplo:
new_df = df.select(concat(df.a, df.b, df.c))
concat_ws (sep, * cols)
v1.5 e superior
Igual a
concat
mas usa o separador especificado.Por exemplo:
new_df = df.select(concat_ws('-', df.col1, df.col2))
map_concat (* cols)
v2.4 e superior
Usado para concat mapas, retorna a união de todos os mapas fornecidos.
Por exemplo:
new_df = df.select(map_concat("map1", "map2"))
Usando o operador concat de string (
||
):v2.3 e superior
Por exemplo:
df = spark.sql("select col_a || col_b || col_c as abc from table_x")
Referência: Spark sql doc
fonte
No Spark 2.3.0, você pode fazer:
fonte
Em Java, você pode fazer isso para concatenar várias colunas. O código de amostra é para fornecer a você um cenário e como usá-lo para melhor compreensão.
O código acima concatenou col1, col2, col3 separados por "_" para criar uma coluna com o nome "concatenatedCol".
fonte
Temos sintaxe java correspondente ao processo abaixo
fonte
Outra maneira de fazer isso no pySpark usando sqlContext ...
fonte
Na verdade, existem algumas abstrações embutidas bonitas para você realizar sua concatenação sem a necessidade de implementar uma função personalizada. Como você mencionou o Spark SQL, suponho que você está tentando passá-lo como um comando declarativo por meio de spark.sql (). Nesse caso, você pode realizar de maneira direta, passando o comando SQL como:
SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;
Além disso, a partir do Spark 2.3.0, você pode usar comandos em linhas com:
SELECT col1 || col2 AS concat_column_name FROM <table_name>;
Onde, é o seu delimitador preferido (também pode ser um espaço vazio) e é a tabela temporária ou permanente a partir da qual você está tentando ler.
fonte
Podemos usar simplesmente SelectExpr também. df1.selectExpr ("*", "superior (_2 || _3) como novo")
fonte