Apache Spark DataFrame'de sütunları birleştirin


Yanıtlar:


175

Ham SQL ile şunları kullanabilirsiniz CONCAT:

  • Python'da

    df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
    df.registerTempTable("df")
    sqlContext.sql("SELECT CONCAT(k, ' ',  v) FROM df")
  • Scala'da

    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")

Spark concat1.5.0'dan beri işlevi DataFrame API ile kullanabilirsiniz :

  • Python'da:

    from pyspark.sql.functions import concat, col, lit
    
    df.select(concat(col("k"), lit(" "), col("v")))
  • Scala'da:

    import org.apache.spark.sql.functions.{concat, lit}
    
    df.select(concat($"k", lit(" "), $"v"))

concat_wsİlk argüman olarak bir dizge ayırıcısı alan bir fonksiyon da vardır .


46

Özel adlandırmayı nasıl yapabileceğiniz aşağıda açıklanmıştır

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()

verir

+--------+--------+
|colname1|colname2|
+--------+--------+
|   row11|   row12|
|   row21|   row22|
+--------+--------+

birleştirerek yeni sütun oluşturun:

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|
+--------+--------+-------------+

4
litbir sütun oluşturur_
müon

34

Spark Scala'da dize sütunlarını birleştirmek için bir seçenek kullanıyor concat.

Boş değerleri kontrol etmek gerekir . Çünkü sütunlardan biri boşsa, diğer sütunlardan birinin bilgisi olsa bile sonuç boş olacaktır.

Kullanılması concatve withColumn:

val newDf =
  df.withColumn(
    "NEW_COLUMN",
    concat(
      when(col("COL1").isNotNull, col("COL1")).otherwise(lit("null")),
      when(col("COL2").isNotNull, col("COL2")).otherwise(lit("null"))))

Kullanılması concatve select:

val newDf = df.selectExpr("concat(nvl(COL1, ''), nvl(COL2, '')) as NEW_COLUMN")

Her iki yaklaşımda da bir NEW_COLUMN değerine sahip olacaksınız, bu değer sütunların bir birleşimidir: orijinal df'nizden COL1 ve COL2.


1
Yönteminizi pyspark'ta denedim ama işe yaramadı, "sütun Column olmalı" uyarısı.
Samson

@Samson üzgünüm, sadece Scala API'sini kontrol ettim
Ignacio Alorre

3
@IgnacioAlorre concat_wsBunun yerine kullanıyorsanız concat, NULL'u kontrol etmekten kaçınabilirsiniz.
Aswath K

18

DF kullanarak yapmak istiyorsanız, mevcut sütunlara göre yeni bir sütun eklemek için bir udf kullanabilirsiniz.

val sqlContext = new SQLContext(sc)
case class MyDf(col1: String, col2: String)

//here is our dataframe
val df = sqlContext.createDataFrame(sc.parallelize(
    Array(MyDf("A", "B"), MyDf("C", "D"), MyDf("E", "F"))
))

//Define a udf to concatenate two passed in string values
val getConcatenated = udf( (first: String, second: String) => { first + " " + second } )

//use withColumn method to add a new column called newColName
df.withColumn("newColName", getConcatenated($"col1", $"col2")).select("newColName", "col1", "col2").show()

12

Spark 2.3'ten ( SPARK-22771 ) Spark SQL, bitiştirme operatörünü destekler ||.

Örneğin;

val df = spark.sql("select _c1 || _c2 as concat_column from <table_name>")

10

Bunu pyspark için yapmanın başka bir yolu:

#import concat and lit functions from pyspark.sql.functions 
from pyspark.sql.functions import concat, lit

#Create your data frame
countryDF = sqlContext.createDataFrame([('Ethiopia',), ('Kenya',), ('Uganda',), ('Rwanda',)], ['East Africa'])

#Use select, concat, and lit functions to do the concatenation
personDF = countryDF.select(concat(countryDF['East Africa'], lit('n')).alias('East African'))

#Show the new data frame
personDF.show()

----------RESULT-------------------------

84
+------------+
|East African|
+------------+
|   Ethiopian|
|      Kenyan|
|     Ugandan|
|     Rwandan|
+------------+

7

Dataframe'deki sütunların sayısını veya adını bilmediğinizde size bir öneri.

val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))

4

concat (* sütun)

v1.5 ve üstü

Birden çok giriş sütununu tek bir sütunda birleştirir. İşlev dizeler, ikili ve uyumlu dizi sütunlarıyla çalışır.

Örneğin: new_df = df.select(concat(df.a, df.b, df.c))


concat_ws (sep, * cols)

v1.5 ve üstü

Benzerdir concatancak belirtilen ayırıcıyı kullanır.

Örneğin: new_df = df.select(concat_ws('-', df.col1, df.col2))


map_concat (* sütun)

v2.4 ve üstü

Haritaları birleştirmek için kullanılır, verilen tüm haritaların birleşimini döndürür.

Örneğin: new_df = df.select(map_concat("map1", "map2"))


String concat operatörünü ( ||) kullanma:

v2.3 ve üstü

Örneğin: df = spark.sql("select col_a || col_b || col_c as abc from table_x")

Referans: Spark sql doc


2

Spark 2.3.0'da şunları yapabilirsiniz:

spark.sql( """ select '1' || column_a from table_a """)

1

Java'da bunu birden çok sütunu birleştirmek için yapabilirsiniz. Örnek kod, size bir senaryo sağlamak ve daha iyi anlamak için onu nasıl kullanacağınızı sağlamaktır.

SparkSession spark = JavaSparkSessionSingleton.getInstance(rdd.context().getConf());
Dataset<Row> reducedInventory = spark.sql("select * from table_name")
                        .withColumn("concatenatedCol",
                                concat(col("col1"), lit("_"), col("col2"), lit("_"), col("col3")));


class JavaSparkSessionSingleton {
    private static transient SparkSession instance = null;

    public static SparkSession getInstance(SparkConf sparkConf) {
        if (instance == null) {
            instance = SparkSession.builder().config(sparkConf)
                    .getOrCreate();
        }
        return instance;
    }
}

Yukarıdaki kod, "concatenatedCol" adlı bir sütun oluşturmak için "_" ile ayrılmış col1, col2, col3'ü birleştirdi.


1

Aşağıdaki sürece karşılık gelen java sözdizimimiz var mı

val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))

0

Bunu sqlContext kullanarak pySpark'ta yapmanın başka bir yolu ...

#Suppose we have a dataframe:
df = sqlContext.createDataFrame([('row1_1','row1_2')], ['colname1', 'colname2'])

# Now we can concatenate columns and assign the new column a name 
df = df.select(concat(df.colname1, df.colname2).alias('joined_colname'))

0

Gerçekten de, özel bir işlevi uygulamaya gerek kalmadan birleştirmenizi gerçekleştirmeniz için bazı güzel dahili soyutlamalar vardır. Spark SQL'den bahsettiğinizden beri, tahmin ediyorum ki onu spark.sql () aracılığıyla bildirimsel bir komut olarak geçirmeye çalışıyorsunuz. Öyleyse, aşağıdaki gibi SQL komutunu geçerek doğrudan gerçekleştirebilirsiniz: SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;

Ayrıca Spark 2.3.0'dan şu satırlarda komutları kullanabilirsiniz: SELECT col1 || col2 AS concat_column_name FROM <table_name>;

Burada, tercih ettiğiniz sınırlayıcıdır (boş alan da olabilir) ve okumaya çalıştığınız geçici veya kalıcı tablodur.


0

SelectExpr'i de basitçe kullanabiliriz. df1.selectExpr ("*", "yeni olarak üst (_2 || _3)")

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.