python - كيفية تغيير أسماء الأعمدة dataframe في pyspark؟




apache-spark pyspark-sql (8)

لقد جئت من خلفية الباندا واعتدت على قراءة البيانات من ملفات CSV في إطار بيانات ثم ببساطة تغيير أسماء الأعمدة إلى شيء مفيد باستخدام الأمر البسيط:

df.columns = new_column_name_list

ومع ذلك ، لا يعمل نفس الشيء في مخططات بيانات pyspark التي تم إنشاؤها باستخدام sqlContext. الحل الوحيد الذي يمكن أن أفهمه للقيام بذلك بسهولة هو ما يلي:

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


أنا استخدم هذا واحد:

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

إذا كنت ترغب في إعادة تسمية عمود واحد والاحتفاظ بالباقي كما هو:

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

إذا كنت تريد تغيير جميع أسماء الأعمدة ، فجرب df.toDF(*cols)


لإعادة تسمية عمود واحد ، لا يزال بإمكانك استخدام toDF (). فمثلا،

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

هذا هو النهج الذي استخدمته:

إنشاء جلسة pyspark:

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|
+-------+---------+-------+

هناك العديد من الطرق للقيام بذلك:

  • الخيار 1. استخدام selectExpr .

    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)
  • الخيار 2. باستخدام withColumnRenamed ، لاحظ أن هذه الطريقة تتيح لك "الكتابة فوق" نفس العمود.

    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. باستخدام alias ، في سكالا يمكنك أيضا استخدام.

    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|
    #+-------+---+
  • الخيار 4. باستخدام sqlContext.sql ، والذي يتيح لك استخدام استعلامات SQL في DataFrames المسجلة 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|
    #+-------+---+

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


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

ميزة استخدام هذه الطريقة: مع قائمة طويلة من الأعمدة التي ترغب في تغيير أسماء الأعمدة قليلة فقط. هذا يمكن أن يكون مريحة للغاية في هذه السيناريوهات. مفيد جدًا عند ربط الجداول بأسماء الأعمدة المكررة.





pyspark-sql