আমি কীভাবে একটি স্পার্ক ডেটাফ্রেমে (পাইএসপার্ক ব্যবহার করে) একটি নতুন কলাম যুক্ত করব?


128

আমার একটি স্পার্ক ডেটাফ্রেম রয়েছে (পাইস্পার্ক 1.5.1 ব্যবহার করে) এবং একটি নতুন কলাম যুক্ত করতে চাই।

আমি কোনও সাফল্য ছাড়াই নিম্নলিখিতগুলি চেষ্টা করেছি:

type(randomed_hours) # => list

# Create in Python and transform to RDD

new_col = pd.DataFrame(randomed_hours, columns=['new_col'])

spark_new_col = sqlContext.createDataFrame(new_col)

my_df_spark.withColumn("hours", spark_new_col["new_col"])

এটি ব্যবহার করে একটি ত্রুটিও পেয়েছে:

my_df_spark.withColumn("hours",  sc.parallelize(randomed_hours))

সুতরাং আমি কীভাবে পাইসপार्কের সাথে একটি বিদ্যমান ডেটা ফ্রেমে একটি নতুন কলাম (পাইথন ভেক্টরের উপর ভিত্তি করে) যুক্ত করব?

উত্তর:


207

আপনি DataFrameস্পার্কে একটি স্বেচ্ছাসেবী কলাম যুক্ত করতে পারবেন না । নতুন কলামগুলি কেবল আক্ষরিক ব্যবহারের মাধ্যমে তৈরি করা যেতে পারে ( স্পার্ক ডেটাফ্রেমে ধ্রুবক কলাম কীভাবে যুক্ত করা যায় তাতে অন্যান্য আক্ষরিক ধরণের বিবরণ দেওয়া আছে? )

from pyspark.sql.functions import lit

df = sqlContext.createDataFrame(
    [(1, "a", 23.0), (3, "B", -23.0)], ("x1", "x2", "x3"))

df_with_x4 = df.withColumn("x4", lit(0))
df_with_x4.show()

## +---+---+-----+---+
## | x1| x2|   x3| x4|
## +---+---+-----+---+
## |  1|  a| 23.0|  0|
## |  3|  B|-23.0|  0|
## +---+---+-----+---+

একটি বিদ্যমান কলাম রূপান্তর করা:

from pyspark.sql.functions import exp

df_with_x5 = df_with_x4.withColumn("x5", exp("x3"))
df_with_x5.show()

## +---+---+-----+---+--------------------+
## | x1| x2|   x3| x4|                  x5|
## +---+---+-----+---+--------------------+
## |  1|  a| 23.0|  0| 9.744803446248903E9|
## |  3|  B|-23.0|  0|1.026187963170189...|
## +---+---+-----+---+--------------------+

ব্যবহার করে অন্তর্ভুক্ত join:

from pyspark.sql.functions import exp

lookup = sqlContext.createDataFrame([(1, "foo"), (2, "bar")], ("k", "v"))
df_with_x6 = (df_with_x5
    .join(lookup, col("x1") == col("k"), "leftouter")
    .drop("k")
    .withColumnRenamed("v", "x6"))

## +---+---+-----+---+--------------------+----+
## | x1| x2|   x3| x4|                  x5|  x6|
## +---+---+-----+---+--------------------+----+
## |  1|  a| 23.0|  0| 9.744803446248903E9| foo|
## |  3|  B|-23.0|  0|1.026187963170189...|null|
## +---+---+-----+---+--------------------+----+

বা ফাংশন / ইউডিএফ দিয়ে উত্পন্ন:

from pyspark.sql.functions import rand

df_with_x7 = df_with_x6.withColumn("x7", rand())
df_with_x7.show()

## +---+---+-----+---+--------------------+----+-------------------+
## | x1| x2|   x3| x4|                  x5|  x6|                 x7|
## +---+---+-----+---+--------------------+----+-------------------+
## |  1|  a| 23.0|  0| 9.744803446248903E9| foo|0.41930610446846617|
## |  3|  B|-23.0|  0|1.026187963170189...|null|0.37801881545497873|
## +---+---+-----+---+--------------------+----+-------------------+

পারফরম্যান্স-ভিত্তিক, অন্তর্নির্মিত ফাংশন ( pyspark.sql.functions), যা অনুঘটক অভিব্যক্তিতে মানচিত্র করে সাধারণত পাইথন ব্যবহারকারী সংজ্ঞায়িত ফাংশনগুলির চেয়ে বেশি পছন্দ করা হয়।

আপনি যদি কোনও কলাম হিসাবে একটি স্বেচ্ছাসেবী আরডিডি এর সামগ্রী যুক্ত করতে চান তবে পারেন


1
"নতুন কলামগুলি কেবল আক্ষরিক ব্যবহার করে তৈরি করা যেতে পারে" এই প্রসঙ্গে আক্ষরিক অর্থ কী?
টিমব্রাম

স্পার্ক এর ডকুমেন্টেশন মহান, df.withColumn দেখতে spark.apache.org/docs/2.1.0/api/python/...
স্টিভেন কালো

10
স্পার্ক ডকুমেন্টেশন কেবল "দুর্দান্ত" কারণ এতে চমত্কার পাঠকের অনুশীলন অবধি দুর্দান্ত ব্যবহার শুরু হয়। স্পার্ক (এবং পাইপার্ক) ডেটা স্ট্রাকচারের একটি সত্যিকারের চিড়িয়াখানাটি জুড়ে, এর মধ্যে কীভাবে রূপান্তর করা যায় সে সম্পর্কে খুব কম বা কোনও নির্দেশনা রয়েছে। দৃষ্টিতে কেস: এই জাতীয় প্রশ্নের মতোই প্রশ্ন প্রসারণ।
শ্যাডট্যালকার

62

কোনও ইউডিএফ ব্যবহার করে একটি কলাম যুক্ত করতে:

df = sqlContext.createDataFrame(
    [(1, "a", 23.0), (3, "B", -23.0)], ("x1", "x2", "x3"))

from pyspark.sql.functions import udf
from pyspark.sql.types import *

def valueToCategory(value):
   if   value == 1: return 'cat1'
   elif value == 2: return 'cat2'
   ...
   else: return 'n/a'

# NOTE: it seems that calls to udf() must be after SparkContext() is called
udfValueToCategory = udf(valueToCategory, StringType())
df_with_cat = df.withColumn("category", udfValueToCategory("x1"))
df_with_cat.show()

## +---+---+-----+---------+
## | x1| x2|   x3| category|
## +---+---+-----+---------+
## |  1|  a| 23.0|     cat1|
## |  3|  B|-23.0|      n/a|
## +---+---+-----+---------+

30

জন্য স্পার্ক 2.0

# assumes schema has 'age' column 
df.select('*', (df.age + 10).alias('agePlusTen'))

1
Df.select ("* ', (df.age + 10) .alias (' agePlusTen ')) হওয়া দরকার
ফ্রাঙ্ক বি

1
ধন্যবাদ, এবং আপনি প্রবেশ করলে আপনি df = df.select('*', (df.age + 10).alias('agePlusTen'))কার্যকরভাবে একটি স্বেচ্ছাসূচক কলাম যুক্ত করছেন কারণ @ শূন্য ৩৩৩ আমাদের উপরে সাবধান করে দিয়েছিল যে স্পার্কে এটি করাতে কোনও সমস্যা না থাকলে, পান্ডাসে এটি আদর্শ উপায় ..
এলাচ

পাইস্পার্কের জন্য কি এর কোনও সংস্করণ রয়েছে?
তাগর

@ তাগর উপরে স্নিপেট অজগর।
লুক ডাব্লু

1
@ জিফ্রেএন্ডারসন,df.select('*', df.age + 10, df.age + 20)
মার্ক রাজকক

2

পাইস্পার্কে আমরা একটি নতুন কলাম যুক্ত করতে পারি এমন একাধিক উপায় রয়েছে।

প্রথমে একটি সাধারণ ডেটা ফ্রেম তৈরি করা যাক।

date = [27, 28, 29, None, 30, 31]
df = spark.createDataFrame(date, IntegerType())

এখন কলামটির মান দ্বিগুণ করার চেষ্টা করুন এবং এটি একটি নতুন কলামে সংরক্ষণ করুন। একই অর্জনের জন্য পিএফবি কয়েকটি ভিন্ন ভিন্ন পদ্ধতি।

# Approach - 1 : using withColumn function
df.withColumn("double", df.value * 2).show()

# Approach - 2 : using select with alias function.
df.select("*", (df.value * 2).alias("double")).show()

# Approach - 3 : using selectExpr function with as clause.
df.selectExpr("*", "value * 2 as double").show()

# Approach - 4 : Using as clause in SQL statement.
df.createTempView("temp")
spark.sql("select *, value * 2 as double from temp").show()

স্পার্ক ডেটাফ্রেম ফাংশন সম্পর্কিত আরও উদাহরণ এবং ব্যাখ্যার জন্য, আপনি আমার ব্লগটি দেখতে পারেন

আশা করি এটা কাজে লাগবে.


0

একটি udfযুক্ত করার সময় আপনি একটি নতুন সংজ্ঞা দিতে পারেন column_name:

u_f = F.udf(lambda :yourstring,StringType())
a.select(u_f().alias('column_name')

0
from pyspark.sql.functions import udf
from pyspark.sql.types import *
func_name = udf(
    lambda val: val, # do sth to val
    StringType()
)
df.withColumn('new_col', func_name(df.old_col))

আপনাকে কল করার প্রয়োজন StringType()
গবার্গার

0

আমি খুব অনুরূপ ব্যবহারের ক্ষেত্রে একটি সাধারণ উদাহরণ দিতে চাই:

কেস ব্যবহার করুন: আমার একটি সিএসভি রয়েছে:

First|Third|Fifth
data|data|data
data|data|data
...billion more lines

আমাকে কিছু রূপান্তর করতে হবে এবং চূড়ান্ত সিএসভির মতো দেখতে দরকার

First|Second|Third|Fourth|Fifth
data|null|data|null|data
data|null|data|null|data
...billion more lines

আমার এটি করা দরকার কারণ এটি কিছু মডেল দ্বারা সংজ্ঞায়িত স্কিমা এবং এসকিউএল বাল্ক সন্নিবেশ এবং এই জাতীয় জিনিসগুলির সাথে আমার চূড়ান্ত ডেটা আন্তঃযোগযোগ্য হতে হবে।

তাই:

1) আমি স্পার্ক.আরড ব্যবহার করে মূল সিএসভি পড়ি এবং এটিকে "ডিএফ" বলি।

2) আমি ডেটাতে কিছু করি।

3) আমি এই স্ক্রিপ্টটি ব্যবহার করে নাল কলামগুলি যুক্ত করব:

outcols = []
for column in MY_COLUMN_LIST:
    if column in df.columns:
        outcols.append(column)
    else:
        outcols.append(lit(None).cast(StringType()).alias('{0}'.format(column)))

df = df.select(outcols)

এইভাবে, আপনি কোনও সিএসভি লোড করার পরে আপনার স্কিমাটি কাঠামো তৈরি করতে পারেন (কলামগুলি পুনরায় অর্ডার করার জন্যও কাজ করতে পারেন যদি আপনাকে অনেক টেবিলের জন্য এটি করতে হয়)।


0

কলাম যুক্ত করার সহজ উপায় হ'ল "উইথ কলাম" ব্যবহার করা। যেহেতু ডেটাফ্রেমটি এসকিউএল কনটেক্সট ব্যবহার করে তৈরি করা হয়েছে, আপনাকে স্কিমা নির্দিষ্ট করতে হবে বা ডিফল্টরূপে ডেটাসেটে উপলভ্য হতে পারে। যদি স্কিমাটি নির্দিষ্ট করা থাকে তবে প্রতিবার পরিবর্তন করার সময় কাজের চাপ ক্লান্তিকর হয়ে ওঠে।

নীচে একটি উদাহরণ যা আপনি বিবেচনা করতে পারেন:

from pyspark.sql import SQLContext
from pyspark.sql.types import *
sqlContext = SQLContext(sc) # SparkContext will be sc by default 

# Read the dataset of your choice (Already loaded with schema)
Data = sqlContext.read.csv("/path", header = True/False, schema = "infer", sep = "delimiter")

# For instance the data has 30 columns from col1, col2, ... col30. If you want to add a 31st column, you can do so by the following:
Data = Data.withColumn("col31", "Code goes here")

# Check the change 
Data.printSchema()

0

আমরা নীচের পদক্ষেপগুলি সহ সরাসরি ডেফ্রেমে অতিরিক্ত কলাম যুক্ত করতে পারি:

from pyspark.sql.functions import when
df = spark.createDataFrame([["amit", 30], ["rohit", 45], ["sameer", 50]], ["name", "age"])
df = df.withColumn("profile", when(df.age >= 40, "Senior").otherwise("Executive"))
df.show()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.