কীভাবে পিসপার্কে ডেটাফ্রেম কলামের নাম পরিবর্তন করবেন?


201

আমি পান্ডাস ব্যাকগ্রাউন্ড থেকে এসেছি এবং সিএসভি ফাইলগুলি থেকে ডেটাফ্রেমে ডেটা পড়তে অভ্যস্ত এবং তারপরে সহজ কমান্ডটি ব্যবহার করে কলামের নামগুলি দরকারী কিছুতে পরিবর্তিত করব:

df.columns = new_column_name_list

তবে, sqlContext ব্যবহার করে তৈরি করা pyspark ডেটা ফ্রেমগুলিতে একই কাজ করে না। আমি সহজেই এটি করতে কেবলমাত্র সমাধানটি হ'ল নিম্নলিখিতটি:

df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', inferschema='true', delimiter='\t').load("data.txt")
oldSchema = df.schema
for i,k in enumerate(oldSchema.fields):
  k.name = new_column_name_list[i]
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', delimiter='\t').load("data.txt", schema=oldSchema)

এটি মূলত দুটি বার ভেরিয়েবলটি সংজ্ঞায়িত করছে এবং স্কিমাটি অনুমান করছে প্রথমে কলামের নাম পরিবর্তন করে এবং তারপরে আপডেট হওয়া স্কিমা দিয়ে আবার ডেটা ফ্রেম লোড করছে।

আমরা পান্ডে করে যাবার মতো আরও কি আরও কার্যকর এবং কার্যকর উপায় আছে?

আমার স্পার্ক সংস্করণ 1.5.0

উত্তর:


334

এটি করার বিভিন্ন উপায় রয়েছে:

  • বিকল্প 1. নির্বাচন করুন নির্বাচন করুন

    data = sqlContext.createDataFrame([("Alberto", 2), ("Dakota", 2)], 
                                      ["Name", "askdaosdka"])
    data.show()
    data.printSchema()
    
    # Output
    #+-------+----------+
    #|   Name|askdaosdka|
    #+-------+----------+
    #|Alberto|         2|
    #| Dakota|         2|
    #+-------+----------+
    
    #root
    # |-- Name: string (nullable = true)
    # |-- askdaosdka: long (nullable = true)
    
    df = data.selectExpr("Name as name", "askdaosdka as age")
    df.show()
    df.printSchema()
    
    # Output
    #+-------+---+
    #|   name|age|
    #+-------+---+
    #|Alberto|  2|
    #| Dakota|  2|
    #+-------+---+
    
    #root
    # |-- name: string (nullable = true)
    # |-- age: long (nullable = true)
    
  • অপশন ২.আপনার সাথে কলামমেনেম ব্যবহার করে লক্ষ্য করুন যে এই পদ্ধতিটি আপনাকে একই কলামটিকে "ওভাররাইট" করতে দেয়। Python3 জন্য প্রতিস্থাপন xrangeসঙ্গে range

    from functools import reduce
    
    oldColumns = data.schema.names
    newColumns = ["name", "age"]
    
    df = reduce(lambda data, idx: data.withColumnRenamed(oldColumns[idx], newColumns[idx]), xrange(len(oldColumns)), data)
    df.printSchema()
    df.show()
    
  • অপশন 3. ব্যবহার ওরফে , Scala মধ্যে আপনার কাছে ব্যবহার করতে পারেন যেমন

    from pyspark.sql.functions import col
    
    data = data.select(col("Name").alias("name"), col("askdaosdka").alias("age"))
    data.show()
    
    # Output
    #+-------+---+
    #|   name|age|
    #+-------+---+
    #|Alberto|  2|
    #| Dakota|  2|
    #+-------+---+
    
  • অপশন ৪. sqlContext.sql ব্যবহার করে , যা আপনাকে DataFramesটেবিল হিসাবে নিবন্ধিত উপর এসকিউএল কোয়েরি ব্যবহার করতে দেয় ।

    sqlContext.registerDataFrameAsTable(data, "myTable")
    df2 = sqlContext.sql("SELECT Name AS name, askdaosdka as age from myTable")
    
    df2.show()
    
    # Output
    #+-------+---+
    #|   name|age|
    #+-------+---+
    #|Alberto|  2|
    #| Dakota|  2|
    #+-------+---+
    

1
আমি এটি একটি forলুপ + দিয়ে করেছি withColumnRenamedতবে আপনার reduceবিকল্পটি খুব সুন্দর :)
ফিলিপ জেরার্ড

1
ঠিক আছে যেহেতু স্পার্কে ডিএফ-তে কোনও অ্যাকশন না বলা পর্যন্ত কিছুই করা হয় না, এটি কেবল কম মার্জিত কোড ... শেষ পর্যন্ত ফলাফলটি ডিএফ হুবহু!
ফিলিপ জেরার্ড

2
@ ফিলিপগেরার্ড দয়া করে এই পোস্টটি দেখুন , আপনার অনেক কলাম থাকলে খারাপ জিনিস ঘটতে পারে।
আলবার্তো বনসন্তো

1
@

3
@ নিউভ্যালু, আপনার প্রথমে চালানো উচিতfrom functools import reduce
joaofbsm

169
df = df.withColumnRenamed("colName", "newColName")
       .withColumnRenamed("colName2", "newColName2")

এইভাবে ব্যবহারের সুবিধা: কলামগুলির দীর্ঘ তালিকা সহ আপনি কেবল কয়েকটি কলামের নাম পরিবর্তন করতে চান। এই পরিস্থিতিতে এটি খুব সুবিধাজনক হতে পারে। সদৃশ কলামের নাম সহ সারণিতে যোগদানের সময় খুব দরকারী useful


এই সমাধানের কোনও রূপ আছে যা অন্য সমস্ত কলামগুলি অপরিবর্তিত রেখে দেয়? এই পদ্ধতিটি এবং অন্যদের সাথে কেবল স্পষ্টভাবে নামযুক্ত কলামগুলিই রয়ে গেছে (অন্য সমস্ত সরানো হয়েছে)
কোয়েটজলক্যাটল

1
+1 এটি আমার পক্ষে ভাল কাজ করেছে, সুনির্দিষ্ট নির্দিষ্ট কলামটি সম্পাদনা করে অন্যকে অপরিবর্তিত রেখে কোনও কলাম অপসারণ করা হয়নি।
mnis.p

2
@ কিয়েজটালকোটল এই কমান্ডটি অন্যান্য নির্দিষ্ট কলামগুলি রক্ষণাবেক্ষণ করে কেবলমাত্র নির্দিষ্ট কলামকেই পরিবর্তন করতে উপস্থিত হবে। অতএব, সম্ভাব্য অনেক কলাম নামগুলির মধ্যে একটির নতুন নামকরণের জন্য একটি দুর্দান্ত কমান্ড
user989762

@ ব্যবহারকারী989762: সম্মত; আমার প্রাথমিক বোঝাপড়াটি এই সম্পর্কে ভুল ছিল ...!
কোয়েটজলকোটল

61

আপনি যদি সমস্ত কলামের নাম পরিবর্তন করতে চান তবে চেষ্টা করুন df.toDF(*cols)


5
এই সমাধানটি ওপি অনুসারে df.collines = new_column_name_list এর নিকটতম, এটি কতটা সংক্ষিপ্ত এবং এর সম্পাদন উভয় ক্ষেত্রেই।
কোয়েটজলকোটল

আমি মনে করি এটি সেরা উত্তর হিসাবে নির্বাচন করা উচিত
HanaKaze

আমার জন্য আমি একটি পান্ডাস ডেটাফ্রেম থেকে শিরোনামের নামগুলি পেয়েছিলাম, তাই আমি স্রেফ ব্যবহার করেছিdf = df.toDF(*my_pandas_df.columns)
নিক স্কোজজারো

এই উত্তরটি আমাকে বিভ্রান্ত করে। পুরানো কলামের নাম থেকে নতুন নামগুলিতে ম্যাপিং হওয়া উচিত নয়? এটি কি colsনতুন কলামের নাম হয়ে এবং কেবল নামের colsক্রমটি ডাটাফ্রেমের কলাম ক্রমের সাথে মিল রেখে কাজ করে?
আরবি্যাট

47

আপনি যদি সমস্ত কলামের নামগুলিতে একটি সাধারণ রূপান্তর প্রয়োগ করতে চান তবে এই কোডটি কৌশলটি কার্যকর করে: (আমি সমস্ত স্থানকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন করছি)

new_column_name_list= list(map(lambda x: x.replace(" ", "_"), df.columns))

df = df.toDF(*new_column_name_list)

toDfকৌতুক জন্য @ ব্যবহারকারী 8117731 ধন্যবাদ ।


13

আপনি যদি একটি একক কলামের নাম পরিবর্তন করতে চান এবং বাকিটিকে যেমন রাখেন:

from pyspark.sql.functions import col
new_df = old_df.select(*[col(s).alias(new_name) if s == column_to_change else s for s in old_df.columns])

13

df.withColumnRenamed('age', 'age2')


1
পঙ্কজ কুমারের উত্তর এবং আলবার্তো বনস্যান্টোর উত্তর (যা যথাক্রমে ২০১ and এবং ২০১৫ এর মধ্যে রয়েছে) ইতিমধ্যে ব্যবহারের পরামর্শ দিয়েছে withColumnRenamed
অ্যান্ড্রু মায়ার্স

ধন্যবাদ, হ্যাঁ, তবে বিভিন্ন সিনট্যাক্সের কয়েকটি রয়েছে, সম্ভবত আমাদের সেগুলি আরও একটি আনুষ্ঠানিক উত্তরে সংগ্রহ করা উচিত? ডেটা.বিহীন কলামমিনেমড (পুরাতন কলামগুলি [আইডিএক্স], নতুন কলামগুলি [আইডিএক্স]) বনাম ডেটা। উইথ কলাম রিনামড (কলামনাম, নতুন কলামনাম) আমার মনে হয় এটি আপনার ব্যবহারের পিস্কপার্কের কোন সংস্করণের উপর নির্ভর করে
সাহান জয়সুমনা

1
এটি আলাদা সিনট্যাক্স নয়। পার্থক্য কেবলমাত্র আপনি নিজের কলামের নামগুলি একটি অ্যারেতে সঞ্চয় করেন নি।
এড বোর্ডিন

13

এটিই আমি ব্যবহার করেছি:

পাইপার্ক সেশন তৈরি করুন:

import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('changeColNames').getOrCreate()

ডেটাফ্রেম তৈরি করুন:

df = spark.createDataFrame(data = [('Bob', 5.62,'juice'),  ('Sue',0.85,'milk')], schema = ["Name", "Amount","Item"])

কলামের নাম সহ ডিএফ দেখুন:

df.show()
+----+------+-----+
|Name|Amount| Item|
+----+------+-----+
| Bob|  5.62|juice|
| Sue|  0.85| milk|
+----+------+-----+

নতুন কলামের নাম সহ একটি তালিকা তৈরি করুন:

newcolnames = ['NameNew','AmountNew','ItemNew']

df এর কলামের নাম পরিবর্তন করুন:

for c,n in zip(df.columns,newcolnames):
    df=df.withColumnRenamed(c,n)

নতুন কলামের নাম সহ ডিএফ দেখুন:

df.show()
+-------+---------+-------+
|NameNew|AmountNew|ItemNew|
+-------+---------+-------+
|    Bob|     5.62|  juice|
|    Sue|     0.85|   milk|
+-------+---------+-------+

9

আমি পিসপার্ক ডেটাফ্রেমের জন্য একাধিক কলামগুলির নাম পরিবর্তন করতে ফাংশনটি ব্যবহার করা সহজ করেছিলাম, যদি কেউ এটি ব্যবহার করতে চায় তবে:

def renameCols(df, old_columns, new_columns):
    for old_col,new_col in zip(old_columns,new_columns):
        df = df.withColumnRenamed(old_col,new_col)
    return df

old_columns = ['old_name1','old_name2']
new_columns = ['new_name1', 'new_name2']
df_renamed = renameCols(df, old_columns, new_columns)

সতর্কতা অবলম্বন করুন, উভয় তালিকাগুলি একই দৈর্ঘ্যের হতে হবে।


1
এই এক ভাল কাজ। আমার যা প্রয়োজন তার জন্য কিছুটা ওভারকিল। এবং আপনি কেবল ডিএফ পাস করতে পারেন কারণ old_columnsএকই হবে df.columns
ডার্ট এগ্রিগিয়াস

6

মাত্র একটি কলামের পুনরায় নামকরণের অন্য উপায় (ব্যবহার করে import pyspark.sql.functions as F):

df = df.select( '*', F.col('count').alias('new_count') ).drop('count')

3

আমি এটি ব্যবহার করি:

from pyspark.sql.functions import col
df.select(['vin',col('timeStamp').alias('Date')]).show()

2
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
ইসমা

1

আপনি আপনার ডেটাফ্রেমের সমস্ত কলামকে নতুন করে ফাংশনটি ব্যবহার করতে পারেন।

def df_col_rename(X, to_rename, replace_with):
    """
    :param X: spark dataframe
    :param to_rename: list of original names
    :param replace_with: list of new names
    :return: dataframe with updated names
    """
    import pyspark.sql.functions as F
    mapping = dict(zip(to_rename, replace_with))
    X = X.select([F.col(c).alias(mapping.get(c, c)) for c in to_rename])
    return X

আপনার কেবল কয়েকটি কলামের নাম আপডেট করার প্রয়োজন থাকলে, আপনি একই কলামের নামটি প্রতিস্থাপন_ তালিকাতে ব্যবহার করতে পারেন

সমস্ত কলামের নতুন নামকরণ করতে

df_col_rename(X,['a', 'b', 'c'], ['x', 'y', 'z'])

কিছু কলামের নতুন নামকরণ করতে

df_col_rename(X,['a', 'b', 'c'], ['a', 'y', 'z'])

0

একক কলামের পুনঃনামের জন্য, আপনি এখনও টুএফ () ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,

df1.selectExpr("SALARY*2").toDF("REVISED_SALARY").show()

0

কলামের নামটি পরিবর্তন করতে আমরা বিভিন্ন পদ্ধতি ব্যবহার করতে পারি।

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

df = spark.createDataFrame([("x", 1), ("y", 2)], 
                                  ["col_1", "col_2"])

এখন আসুন কল_1 এর নাম পাল্টানোর চেষ্টা করুন Col_3 এ। পিএফবি একই কাজ করার জন্য কয়েকটি পন্থা।

# Approach - 1 : using withColumnRenamed function.
df.withColumnRenamed("col_1", "col_3").show()

# Approach - 2 : using alias function.
df.select(df["col_1"].alias("col3"), "col_2").show()

# Approach - 3 : using selectExpr function.
df.selectExpr("col_1 as col_3", "col_2").show()

# Rename all columns
# Approach - 4 : using toDF function. Here you need to pass the list of all columns present in DataFrame.
df.toDF("col_3", "col_2").show()

এখানে আউটপুট।

+-----+-----+
|col_3|col_2|
+-----+-----+
|    x|    1|
|    y|    2|
+-----+-----+

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

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