Yanıtlar:
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 concat
1.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 .
Ö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|
+--------+--------+-------------+
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ı concat
ve 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ı concat
ve 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.
concat_ws
Bunun yerine kullanıyorsanız concat
, NULL'u kontrol etmekten kaçınabilirsiniz.
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()
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>")
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|
+------------+
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))
v1.5 ve üstü
Benzerdir concat
ancak belirtilen ayırıcıyı kullanır.
Örneğin: new_df = df.select(concat_ws('-', df.col1, df.col2))
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
Spark 2.3.0'da şunları yapabilirsiniz:
spark.sql( """ select '1' || column_a from table_a """)
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.
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)): _*))
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'))
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.
SelectExpr'i de basitçe kullanabiliriz. df1.selectExpr ("*", "yeni olarak üst (_2 || _3)")
lit
bir sütun oluşturur_