কিভাবে একটি স্পার্ক ডেটাফ্রেমে একটি ধ্রুবক কলাম যুক্ত করবেন?


137

আমি DataFrameকিছু স্বেচ্ছাচারিত মান সহ একটি কলাম যুক্ত করতে চাই (এটি প্রতিটি সারির জন্য একই)। আমি withColumnনিম্নলিখিত হিসাবে ব্যবহার করার সময় একটি ত্রুটি পাই :

dt.withColumn('new_column', 10).head(5)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-50-a6d0257ca2be> in <module>()
      1 dt = (messages
      2     .select(messages.fromuserid, messages.messagetype, floor(messages.datetime/(1000*60*5)).alias("dt")))
----> 3 dt.withColumn('new_column', 10).head(5)

/Users/evanzamir/spark-1.4.1/python/pyspark/sql/dataframe.pyc in withColumn(self, colName, col)
   1166         [Row(age=2, name=u'Alice', age2=4), Row(age=5, name=u'Bob', age2=7)]
   1167         """
-> 1168         return self.select('*', col.alias(colName))
   1169 
   1170     @ignore_unicode_prefix

AttributeError: 'int' object has no attribute 'alias'

দেখে মনে হচ্ছে যে আমি অন্য কলামগুলির মধ্যে একটি যোগ করে এবং বিয়োগ করে (যাতে তারা শূন্যে যুক্ত হয়) এবং তারপরে আমার পছন্দ সংখ্যাটি (এই ক্ষেত্রে 10) যোগ করে ফাংশনটি আমি যেমন চাই তেমন কাজ করতে চাই:

dt.withColumn('new_column', dt.messagetype - dt.messagetype + 10).head(5)
[Row(fromuserid=425, messagetype=1, dt=4809600.0, new_column=10),
 Row(fromuserid=47019141, messagetype=1, dt=4809600.0, new_column=10),
 Row(fromuserid=49746356, messagetype=1, dt=4809600.0, new_column=10),
 Row(fromuserid=93506471, messagetype=1, dt=4809600.0, new_column=10),
 Row(fromuserid=80488242, messagetype=1, dt=4809600.0, new_column=10)]

এটা চরমভাবে হ্যাকি, তাই না? আমি ধরে নিলাম এটি করার আরও একটি বৈধ উপায় আছে?

উত্তর:


220

2.2+ স্পার্ক করুন

2.2 প্রবর্তন সূচনা typedLitসমর্থন করার জন্য Seq, Mapএবং Tuples( স্পার্ক-19254 ) এবং নিম্নলিখিত কল সমর্থিত হতে হবে (Scala):

import org.apache.spark.sql.functions.typedLit

df.withColumn("some_array", typedLit(Seq(1, 2, 3)))
df.withColumn("some_struct", typedLit(("foo", 1, 0.3)))
df.withColumn("some_map", typedLit(Map("key1" -> 1, "key2" -> 2)))

স্পার্ক 1.3+ ( lit), 1.4+ ( array, struct), 2.0+ ( map):

দ্বিতীয় আর্গুমেন্টটি এমন DataFrame.withColumnহওয়া উচিত Columnযাতে আপনাকে আক্ষরিক ব্যবহার করতে হবে:

from pyspark.sql.functions import lit

df.withColumn('new_column', lit(10))

আপনার যদি জটিল কলামগুলির প্রয়োজন হয় তবে আপনি ব্লকগুলি ব্যবহার করে এগুলি তৈরি করতে পারেন array:

from pyspark.sql.functions import array, create_map, struct

df.withColumn("some_array", array(lit(1), lit(2), lit(3)))
df.withColumn("some_struct", struct(lit("foo"), lit(1), lit(.3)))
df.withColumn("some_map", create_map(lit("key1"), lit(1), lit("key2"), lit(2)))

ঠিক একই পদ্ধতি স্কালায় ব্যবহার করা যেতে পারে।

import org.apache.spark.sql.functions.{array, lit, map, struct}

df.withColumn("new_column", lit(10))
df.withColumn("map", map(lit("key1"), lit(1), lit("key2"), lit(2)))

প্রতিটি ক্ষেত্রেই structsব্যবহারের জন্য নাম সরবরাহ করতে alias:

df.withColumn(
    "some_struct",
    struct(lit("foo").alias("x"), lit(1).alias("y"), lit(0.3).alias("z"))
 )

বা castপুরো বস্তুতে

df.withColumn(
    "some_struct", 
    struct(lit("foo"), lit(1), lit(0.3)).cast("struct<x: string, y: integer, z: double>")
 )

এটি ইউডিএফ ব্যবহার করা ধীর হলেও ধীরে ধীরে সম্ভব।

দ্রষ্টব্য :

একই কনস্ট্রাক্টসগুলি ইউডিএফ বা এসকিউএল ফাংশনে স্থির যুক্তিগুলি পাস করার জন্য ব্যবহার করা যেতে পারে।


1
অন্যরা এটি প্রয়োগ করতে ব্যবহার করে ... কলাম পদ্ধতিতে একটি কলাম যুক্ত করে বা একই নাম থাকা বিদ্যমান কলামটি প্রতিস্থাপন করে একটি নতুন ডেটাফ্রেম ফেরত দেয়, সুতরাং আপনাকে ফলাফলগুলি ডিএফ-এ পুনরায় স্বাক্ষর করতে হবে বা একটি নতুন ভেরিয়েবল বরাদ্দ করতে হবে। উদাহরণস্বরূপ, `df = df.withColumn ('new_column', lit (10)) '
এমনকি মিয়েন

প্রতিটি পুনরাবৃত্তির সাথে, আমরা কলামের ভিতরে মানগুলি পরিবর্তন করতে পারি? আমি ইতিমধ্যে এটি চেষ্টা করেছি for i in range(len(item)) : df.withColumn('new_column', lit({}).format(i)) কিন্তু এটি কাজ করে না
ট্রেসি

29

স্পার্ক ২.২ এ ডেটাফ্রেমে একটি কলামে ধ্রুবক মান যুক্ত করার দুটি উপায় রয়েছে:

1) ব্যবহার lit

2) ব্যবহার typedLit

typedLitউভয়ের মধ্যে পার্থক্য হ'ল প্যারামিটারাইজড স্কালার ধরণের যেমন তালিকা, সিক এবং মানচিত্র পরিচালনা করতে পারে

নমুনা ডেটা ফ্রেম:

val df = spark.createDataFrame(Seq((0,"a"),(1,"b"),(2,"c"))).toDF("id", "col1")

+---+----+
| id|col1|
+---+----+
|  0|   a|
|  1|   b|
+---+----+

1) ব্যবহার lit: নতুন কলাম নামক নতুন কলামে ধ্রুব স্ট্রিং মান যুক্ত করা:

import org.apache.spark.sql.functions.lit
val newdf = df.withColumn("newcol",lit("myval"))

ফলাফল:

+---+----+------+
| id|col1|newcol|
+---+----+------+
|  0|   a| myval|
|  1|   b| myval|
+---+----+------+

2) ব্যবহার typedLit:

import org.apache.spark.sql.functions.typedLit
df.withColumn("newcol", typedLit(("sample", 10, .044)))

ফলাফল:

+---+----+-----------------+
| id|col1|           newcol|
+---+----+-----------------+
|  0|   a|[sample,10,0.044]|
|  1|   b|[sample,10,0.044]|
|  2|   c|[sample,10,0.044]|
+---+----+-----------------+

আপনি কি আমদানি বিবৃতি সহ পুরো সংস্করণটি ভাগ করে নিতে পারেন
আয়ুশ ওয়াটসায়ান

স্পার্ক সংস্করণ 2.2.1। আমদানি বিবৃতি pyspark.sql.funtions থেকে আমদানি টাইপলিট থেকে। উপরোক্ত আপনার দ্বারা ভাগ করা একটিকেও চেষ্টা করে দেখুন।
ব্রজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.