অ্যাপাচি স্পার্ক ডেটা ফ্রেমে কলামেনেট কলামগুলি


116

অ্যাপাচি স্পার্ক ডেটাফ্রেমে আমরা কীভাবে দুটি কলামকে সংযুক্ত করতে পারি? স্পার্ক এসকিউএল-তে কোনও ফাংশন রয়েছে যা আমরা ব্যবহার করতে পারি?

উত্তর:


175

কাঁচা এসকিউএল দিয়ে আপনি ব্যবহার করতে পারেন CONCAT:

  • পাইথনে

    df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
    df.registerTempTable("df")
    sqlContext.sql("SELECT CONCAT(k, ' ',  v) FROM df")
    
  • স্কালায়

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

স্পার্ক ০.০.০ থেকে আপনি concatডেটাফ্রেম এপিআই দিয়ে ফাংশন ব্যবহার করতে পারেন :

  • পাইথনে:

    from pyspark.sql.functions import concat, col, lit
    
    df.select(concat(col("k"), lit(" "), col("v")))
    
  • স্কালায়:

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

concat_wsপ্রথম আর্গুমেন্ট হিসাবে একটি স্ট্রিং বিভাজক লাগে যা ফাংশন আছে ।


46

আপনি কীভাবে কাস্টম নামকরণ করতে পারেন তা এখানে

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

দেয়,

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

একচেটিয়াভাবে নতুন কলাম তৈরি করুন:

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
litএকটি কলাম তৈরি করে_
মিউয়ন

34

স্পার্ক স্কালায় স্ট্রিং কলামগুলি সংযুক্ত করার জন্য একটি বিকল্প ব্যবহার করছে concat

নাল মানগুলি পরীক্ষা করা প্রয়োজন । কারণ কলামগুলির কোনও একটি যদি নাল হয় তবে অন্য কলামগুলির একটিতেও তথ্য না থাকলেও ফলাফল নালাগ্রত হবে।

ব্যবহার concatএবং 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"))))

ব্যবহার concatএবং select:

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

উভয় পদ্ধতির সাথে আপনার কাছে একটি NEW_COLUMN থাকবে যার মানটি কলামগুলির একত্রিতকরণ: আপনার মূল df থেকে COL1 এবং COL2।


1
আমি আপনার পদ্ধতিটি পাইপার্ডে চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি, "কোল কলাম হওয়া উচিত" সতর্ক করেছিলাম।
স্যামসন

@ স্যামসন দুঃখিত, আমি কেবল স্কালা এপিআই-এর জন্য যাচাই করেছি
ইগনাসিও অ্যালোরে

3
@ ইগনাসিও অ্যালোর আপনি যদি এর concat_wsপরিবর্তে ব্যবহার করেন তবে আপনি concatNULL পরীক্ষা করা এড়াতে পারবেন।
অশ্বত কে

18

আপনি যদি ডিএফ ব্যবহার করে এটি করতে চান তবে আপনি বিদ্যমান কলামগুলির উপর ভিত্তি করে একটি ইউডিএফ ব্যবহার করতে পারেন।

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


10

পাইস্পার্কের জন্য এটি করার আরও একটি উপায় এখানে রয়েছে:

#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

আপনি যখন ডেটাফ্রেমে কলামগুলির সংখ্যা বা নামটি জানেন না তার জন্য এখানে একটি পরামর্শ is

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

4

CONCAT (* COLS)

v1.5 এবং উচ্চতর

একক কলামে একসাথে একাধিক ইনপুট কলাম সংযুক্ত করে। ফাংশনটি স্ট্রিং, বাইনারি এবং সুসংগত অ্যারে কলামগুলির সাথে কাজ করে।

উদাহরণ: new_df = df.select(concat(df.a, df.b, df.c))


কনক্যাট_উস (সেপ, * কোলস)

v1.5 এবং উচ্চতর

অনুরূপ concatতবে নির্দিষ্ট বিভাজক ব্যবহার করে।

উদাহরণ: new_df = df.select(concat_ws('-', df.col1, df.col2))


map_concat (* COLS)

v2.4 এবং উচ্চতর

মানচিত্রগুলি সংহত করতে ব্যবহৃত, প্রদত্ত সমস্ত মানচিত্রের ইউনিয়ন প্রদান করে।

উদাহরণ: new_df = df.select(map_concat("map1", "map2"))


স্ট্রিং কনক্যাট অপারেটর ( ||) ব্যবহার করে :

v2.3 এবং উচ্চতর

উদাহরণ: df = spark.sql("select col_a || col_b || col_c as abc from table_x")

তথ্যসূত্র: স্পার্ক এসকিএল ডক


2

স্পার্ক ২.৩.০ এ আপনি করতে পারেন:

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

1

জাভাতে আপনি একাধিক কলাম সংলগ্ন করতে এটি করতে পারেন। নমুনা কোডটি আপনাকে একটি দৃশ্য সরবরাহ করার জন্য এবং এটি আরও ভাল বোঝার জন্য কীভাবে ব্যবহার করতে হয়।

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;
    }
}

উপরের কোডটি কনক্যাটনেটেড কল 1, কল 2, কল 3 "_" দ্বারা বিভক্ত হয়ে "কনক্যাটেনটেড কল" নাম সহ একটি কলাম তৈরি করতে পারে।


1

আমাদের কাছে নীচের প্রক্রিয়া অনুসারে জাভা সিনট্যাক্স আছে কি?

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

0

স্কাইলকন্টেক্সট ব্যবহার করে পাইস্পার্কে এটি করার আর একটি উপায় ...

#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

প্রকৃতপক্ষে, কাস্টম ফাংশন বাস্তবায়নের প্রয়োজন ছাড়াই আপনার মনমুগ্ধকরণটি সম্পাদনের জন্য কিছু সুন্দর ইনবিল্ট বিমূর্ততা রয়েছে। যেহেতু আপনি স্পার্ক এসকিউএল উল্লেখ করেছেন, তাই আমি অনুমান করছি যে আপনি এটিকে স্পার্ক.এসকিউএল () এর মাধ্যমে ডিক্লেটারিটিভ কমান্ড হিসাবে পাস করার চেষ্টা করছেন। যদি তা হয় তবে আপনি এসকিউএল কমান্ডটি পাস করার মতো করে সরাসরি এগিয়ে যেতে পারেন: SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;

এছাড়াও, স্পার্ক ২.৩.০ থেকে, আপনি এই লাইনে কমান্ডগুলি ব্যবহার করতে পারেন: SELECT col1 || col2 AS concat_column_name FROM <table_name>;

এর মধ্যে আপনার পছন্দসই ডিলিমিটারটি (খালি জায়গাও হতে পারে) এবং আপনি যে অস্থায়ী বা স্থায়ী টেবিলটি পড়ার চেষ্টা করছেন তা।


0

আমরা পাশাপাশি সিলেক্টেক্সরপ ব্যবহার করতে পারি। df1.selectExpr ("*", "উপরের (_2 || _3) নতুন হিসাবে")

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.