পাইস্পার্কে একাধিক ডেটা ফ্রেম সারি অনুসারে মার্জ করা


21

আমি 10 তথ্য ফ্রেম আছে pyspark.sql.dataframe.DataFrame, থেকে প্রাপ্ত randomSplitযেমন (td1, td2, td3, td4, td5, td6, td7, td8, td9, td10) = td.randomSplit([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1], seed = 100)এখন আমি 9 যোগ দিতে চান td'একটি একক তথ্য ফ্রেম গুলি, আমি কিভাবে কি করা উচিত?

আমি ইতিমধ্যে চেষ্টা করেছি unionAll, কিন্তু এই ফাংশনটি শুধুমাত্র দুটি যুক্তি গ্রহণ করে।

td1_2 = td1.unionAll(td2) 
# this is working fine

td1_2_3 = td1.unionAll(td2, td3) 
# error TypeError: unionAll() takes exactly 2 arguments (3 given)

সারি-ভিত্তিক দুটিরও বেশি ফ্রেম একত্রিত করার কোনও উপায় আছে কি?

এটি করার উদ্দেশ্য হ'ল আমি পাইস্পার্ক CrossValidatorপদ্ধতিটি ব্যবহার না করে ম্যানুয়ালি 10-গুণ ক্রস বৈধকরণ করছি , সুতরাং 9 টি প্রশিক্ষণে এবং 1 টি পরীক্ষার ডেটাতে নিয়ে যাচ্ছি এবং তারপরে আমি এটি অন্য সংমিশ্রণগুলির জন্য পুনরাবৃত্তি করব।


1
এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে আমি এখানে নামকরণের পদ্ধতির উন্নতি করার জন্য একটি পরামর্শ দিচ্ছি যাতে শেষ পর্যন্ত আমাদের টাইপ করতে হবে না, উদাহরণস্বরূপ: [td1, td2, td3, td4, td5, td6, td7 , td8, td9, td10]। 100-গুণ সিভি করার জন্য এটি করার কল্পনা করুন। আমি যা করব তা এখানে: অংশ = [0.1] * 10 সিভি = df7.randomSplit (অংশ) ভাঁজ = তালিকা (রেঞ্জ (10)) আমি সীমার মধ্যে (10): টেস্ট_ডেটা = সিভি [i] ভাঁজ_নো = ফোল্ডস [: i] + ভাঁজ [i + 1:] ট্রেন_ডেটা = সিভি [ভাঁজ_নো [[]]] জে ভাঁজ_নো [i: 1:]: ট্রেন_ডেটা = ট্রেন_ডাটা.উনিওন (সিভি [জে])
এনজিওকে থোগ

উত্তর:


37

চুরি থেকে: /programming/33743978/spark-union-of-m Multipleple-rdds

চেইন ইউনিয়নগুলির বাইরে ডেটাফ্রেমগুলির পক্ষে এটি করার একমাত্র উপায়।

from functools import reduce  # For Python 3.x
from pyspark.sql import DataFrame

def unionAll(*dfs):
    return reduce(DataFrame.unionAll, dfs)

unionAll(td2, td3, td4, td5, td6, td7, td8, td9, td10)

যা ঘটে তা হ'ল এটি আপনি যে সমস্ত বস্তুগুলিকে পরামিতি হিসাবে উত্তীর্ণ করেছেন সেগুলি গ্রহণ করে এবং ইউনিয়নএল ব্যবহার করে তাদের হ্রাস করে (এটি হ্রাস পাইথন থেকে আসে, স্পার্ক হ্রাস হয় না যদিও তারা একইভাবে কাজ করে) যা শেষ পর্যন্ত এটি একটি ডেটা ফ্রেমে হ্রাস করে।

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

সম্পাদনা: আপনার প্রয়োজনের জন্য আমি একটি আলাদা পদ্ধতি প্রস্তাব করছি, যেহেতু ক্রসওয়েডিয়েটের জন্য আপনাকে এই পুরো ইউনিয়নটি আপনার বিভিন্ন ভাঁজগুলির জন্য 10 বার পুনরাবৃত্তি করতে হবে, তাই আমি যে লেবেলগুলির জন্য সন্নিযুক্ত তা যুক্ত করব এবং প্রতিটি ফোল্ডের জন্য কেবল আপনার ডেটাফ্রেমকে ফিল্টার করব লেবেল


(+1) একটি দুর্দান্ত কাজ তবে, এমন একটি ফাংশন থাকা দরকার যা একাধিক ডেটাফ্রেমের সংমিশ্রণকে অনুমতি দেয়। বেশ সহজ হবে!
Dawny33

আমি এর সাথে একমত নই
জান ভ্যান ডের Vegt

@ জাভান্ডারভেগ্ট ধন্যবাদ, এটি কাজ করে এবং প্রশিক্ষণ এবং টেস্টিং ডেটাসেট ফিল্টার করার জন্য লেবেল যুক্ত করার ধারণা, আমি এটি ইতিমধ্যে করেছি। আপনার সাহায্যের জন্য আপনাকে অনেক ধন্যবাদ।
কৃষ্ণ প্রসাদ

@ জান ভ্যান ডের ভেজিট আপনি কি দয়া করে একই যুক্তিটি প্রয়োগ করতে পারেন এবং এই প্রশ্নের উত্তর দিন
জর্জঅফTheআরএফ


6

একসাথে, যখন সংযুক্ত করার জন্য ডেটাফ্রেমগুলির কলামগুলির একই ক্রম না থাকে, তখন উভয় ডিএফের ইউনিয়নের আগে একই কলামের অর্ডার থাকে তা নিশ্চিত করার জন্য df2.select (df1.collines) ভাল।

import functools 

def unionAll(dfs):
    return functools.reduce(lambda df1,df2: df1.union(df2.select(df1.columns)), dfs) 

উদাহরণ:

df1 = spark.createDataFrame([[1,1],[2,2]],['a','b'])
# different column order. 
df2 = spark.createDataFrame([[3,333],[4,444]],['b','a']) 
df3 = spark.createDataFrame([555,5],[666,6]],['b','a']) 

unioned_df = unionAll([df1, df2, df3])
unioned_df.show() 

এখানে চিত্র বর্ণনা লিখুন

অন্যথায় এটি পরিবর্তে নীচের ফলাফল উত্পন্ন করবে।

from functools import reduce  # For Python 3.x
from pyspark.sql import DataFrame

def unionAll(*dfs):
    return reduce(DataFrame.unionAll, dfs) 

unionAll(*[df1, df2, df3]).show()

এখানে চিত্র বর্ণনা লিখুন


2

পুনরাবৃত্তি ব্যবহার সম্পর্কে কীভাবে?

def union_all(dfs):
    if len(dfs) > 1:
        return dfs[0].unionAll(union_all(dfs[1:]))
    else:
        return dfs[0]

td = union_all([td1, td2, td3, td4, td5, td6, td7, td8, td9, td10])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.