In Spark DataFrames, the dropDuplicates
method does not provide a direct equivalent to the keep
parameter in Pandas. However, you can achieve similar functionality by using window functions to assign row numbers based on your desired order, and then filtering based on those row numbers.
To keep the first row for each set of duplicates based on ‘scheduled_datetime’ and ‘flt_flightnumber’, you can use the following approach:
pythonfrom pyspark.sql import SparkSession
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
# Assuming 'scheduled_datetime' and 'flt_flightnumber' are columns 6 and 17 respectively
window_spec = Window.partitionBy("scheduled_datetime", "flt_flightnumber").orderBy("actual_datetime")
df = spark.createDataFrame([...]) # Create or load your DataFrame here
# Add a row number column
df = df.withColumn("row_num", row_number().over(window_spec))
# Keep only the rows where row_num is 1
result_df = df.filter("row_num = 1").drop("row_num")
This will keep the first row for each unique combination of ‘scheduled_datetime’ and ‘flt_flightnumber’. To keep the last row, you can modify the orderBy
clause to orderBy(desc("actual_datetime"))
in the Window
function.
المزيد من المعلومات
في Apache Spark، يمكنك استخدام دالة row_number()
مع النوافذ (Windows) لتعيين أرقام للصفوف بناءً على ترتيب معين، ثم استخدام هذه الأرقام للحفاظ على الصف الأول أو الأخير من بين الصفوف المكررة. النوافذ تسمح لك بتطبيق تحويلات على مجموعة من الصفوف (على سبيل المثال، الصفوف التي تحمل نفس القيم في العمود المحدد) وفقا لترتيب محدد.
الطريقة الموصى بها للحفاظ على الصف الأول لكل مجموعة من الصفوف المكررة هي:
- استخدام الدالة
row_number()
مع النافذة لترقيم الصفوف بناءً على العمود المحدد. - تصفية الصفوف بحيث يتم الاحتفاظ بالصفوف التي يكون رقمها 1 فقط.
اليك الكود الذي يوضح هذه الطريقة:
pythonfrom pyspark.sql import SparkSession
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
# افترض أن 'scheduled_datetime' و 'flt_flightnumber' هما العمود 6 و 17 على التوالي
window_spec = Window.partitionBy("scheduled_datetime", "flt_flightnumber").orderBy("actual_datetime")
df = spark.createDataFrame([...]) # إنشاء الـ DataFrame هنا
# إضافة عمود لترقيم الصفوف
df = df.withColumn("row_num", row_number().over(window_spec))
# الاحتفاظ فقط بالصفوف التي يكون فيها رقم الصف 1
result_df = df.filter("row_num = 1").drop("row_num")
بهذه الطريقة، سيتم الاحتفاظ بالصف الأول من كل مجموعة من الصفوف المتكررة بناءً على القيم في العمودين ‘scheduled_datetime’ و ‘flt_flightnumber’.