স্পার্ক ডেটাফ্রেম ফাঁকা আছে কিনা তা কীভাবে পরীক্ষা করবেন?


106

এখনই, আমাকে খালি আছে df.count > 0কিনা তা পরীক্ষা করতে আমাকে ব্যবহার করতে হবে DataFrame। তবে এটি একরকম অদক্ষ। এটি করার আরও ভাল উপায় আছে কি?

ধন্যবাদ

PS: আমি এটি খালি কিনা তা যাচাই করতে চাই যাতে DataFrameএটি খালি না হলে কেবলমাত্র সংরক্ষণ করি

উত্তর:


158

স্পার্ক ২.১.০ এর জন্য, আমার পরামর্শটি হ'ল যে কোনওটি আপনার কাছে সুস্পষ্ট অভিপ্রায় ব্যবহার করে head(n: Int)বা তার take(n: Int)সাথে isEmpty

df.head(1).isEmpty
df.take(1).isEmpty

পাইথন সমতুল্য:

len(df.head(1)) == 0  # or bool(df.head(1))
len(df.take(1)) == 0  # or bool(df.take(1))

ডেটাফ্রেম খালি থাকলে ব্যবহার df.first()এবং df.head()উভয়ই ফিরিয়ে দেবে java.util.NoSuchElementException। সরাসরি first()কল head(), যা কল head(1).head

def first(): T = head()
def head(): T = head(1).head

head(1)একটি অ্যারে প্রদান করে, সুতরাং অ্যারে গ্রহণের headফলে java.util.NoSuchElementExceptionডেটাফ্রেম খালি থাকে।

def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)

সুতরাং কল করার পরিবর্তে অ্যারে পেতে সরাসরি head()ব্যবহার করুন head(1)এবং তারপরে আপনি ব্যবহার করতে পারেন isEmpty

take(n)সমান head(n)...

def take(n: Int): Array[T] = head(n)

আর limit(1).collect()সমতূল্য head(1)(নোটিশ limit(n).queryExecutionমধ্যে head(n: Int)অন্তত আমি কি বলতে পারেন থেকে পদ্ধতি) এটি নীচের সব হয় সমতুল্য, এবং আপনি একটি ধরতে হবে না java.util.NoSuchElementExceptionব্যতিক্রম যখন DataFrame খালি।

df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty

আমি জানি এটি একটি পুরানো প্রশ্ন তাই আশা করি এটি স্পার্কের নতুন সংস্করণ ব্যবহার করে এমন কাউকে সহায়তা করবে।


20
যারা পাইপার্ক ব্যবহার করছেন তাদের জন্য। ইস্পটি কোনও জিনিস নয়। পরিবর্তে লেন (d.head (1))> 0 করুন।
এন্টিপোন 79

5
কেন তাহলে এই ভাল df.rdd.isEmpty?
ড্যান সিবারোভস্কি - এমএসএফটি

4
df.head (1) .Empty বিশাল সময় নিচ্ছে এর জন্য অন্য কোনও অনুকূলিত সমাধান রয়েছে।
রাকেশ সাব্বানি

4
আরে @ রাকেশ সাব্বানি, যদি আপনি df.head(1)প্রচুর সময় নিচ্ছেন তবে সম্ভবত আপনার dfবাস্তবায়ন পরিকল্পনাটি এমন জটিল কিছু করছে যা স্পার্ককে শর্টকাট নিতে বাধা দেয়। উদাহরণস্বরূপ, আপনি যদি parquet ফাইলগুলি থেকে কেবল পড়ছেন df = spark.read.parquet(...), তবে আমি নিশ্চিত যে স্পার্ক কেবল একটি ফাইল পার্টিশন পড়বে read তবে যদি আপনি dfঅন্যান্য কাজগুলি যেমন একীকরণের কাজ করে থাকেন তবে অসাবধানতাবশত আপনি উত্সের ডেটাগুলির সমস্ত কিছু না থাকলে একটি বড় অংশ পড়তে ও প্রসেস করার জন্য অবিস্মরণীয়ভাবে চাপ দিতে বাধ্য করছেন।
hulin003

কেবলমাত্র আমার অভিজ্ঞতা এভিআইডি-তে জানাচ্ছি: আমি নির্বাকভাবে ব্যবহার করছিলাম df.limit(1).count()। বড় ডেটাসেটগুলিতে এটি @ হুলিন ২০০3 দ্বারা উল্লিখিত উদাহরণগুলির তুলনায় অনেক বেশি সময় নেয় যা প্রায় তাত্ক্ষণিক
ভিজার

48

আমি কেবল অন্তর্নিহিত দখল করতে বলব RDD। স্কালায়:

df.rdd.isEmpty

পাইথনে:

df.rdd.isEmpty()

বলা হচ্ছে যে, এইগুলি সবই কল take(1).length, তাই এটি রোহানের জবাব হিসাবে একই কাজ করবে ... সম্ভবত কিছুটা আরও স্পষ্টভাবে বলা যেতে পারে?


6
এটি আমার ক্ষেত্রে df.count () == 0 এর চেয়ে আশ্চর্যজনকভাবে ধীরে ধীরে
আর্কিটেকোনিক

4
কোনও ভারী কাজকে আরডিডি তে রূপান্তর করা কি নয়?
অলোক

4
আসলে তা না. আরডিডি এর এখনও বেশিরভাগ ক্ষেত্রে স্পার্কের সবকিছুর আন্ডারপিনিং।
জাস্টিন পিহনি

28
ডিএফকে আরডিডিতে রূপান্তর করবেন না। এটি প্রক্রিয়াটি ধীর করে দেয়। আপনি যদি রূপান্তর করেন তবে এটি পুরো ডিএফকে আরডিডিতে রূপান্তর করবে এবং খালি কিনা তা পরীক্ষা করবে। ভাবুন যে ডিএফের কয়েক মিলিয়ন সারি রয়েছে, আরডিডিতে রূপান্তর করতে এটি অনেক সময় নেয়।
নন্দাকিশোর

4
.rdd অনেকটা প্রক্রিয়া অনেকটা ধীর করে দেয়
রাউল এইচ

14

এক head()(এক first()) DataFrameসারি রয়েছে কিনা তা দেখতে আপনি (বা ) ফাংশনগুলির সুবিধা নিতে পারেন । যদি তা হয়, এটি খালি নয়।


10
যদি ডেটাফ্রেমটি খালি থাকে তবে "java.util.NoSuchElementException: খালি পুনরাবৃত্তির পরে"; [1.3.1 স্পার্ক]
ফেলিক্সহো 26'6

8

যেহেতু স্পার্ক ২.৪.০ রয়েছে Dataset.isEmpty

এটি বাস্তবায়ন হ'ল:

def isEmpty: Boolean = 
  withAction("isEmpty", limit(1).groupBy().count().queryExecution) { plan =>
    plan.executeCollect().head.getLong(0) == 0
}

মনে রাখবেন যে DataFrameস্কালায় এখন আর কোনও শ্রেণি নেই, এটি কেবল একটি টাইপ ওরফে (সম্ভবত স্পার্ক ২.০ দিয়ে পরিবর্তিত হয়েছে):

type DataFrame = Dataset[Row]

4
ismpty df.head (1) এর চেয়ে ধীরে ধীরে .আইএসপি
সন্দীপ 540

@ সন্দীপ ৫৪০ সত্যিই? মাপকাঠি? আপনার প্রস্তাব কমপক্ষে এক সারি ইনস্ট্যান্ট করে। স্পার্ক বাস্তবায়ন কেবল একটি সংখ্যা পরিবহন করে। হেড () সীমাবদ্ধতাও ব্যবহার করছে (পাশাপাশি), গ্রুপপাই () আসলে কিছু করছে না, রিলেশনাল গ্রুপডড্যাসেট পাওয়া দরকার যা ফলস্বরূপ গণনা প্রদান করে ()। যাতে উল্লেখযোগ্যভাবে ধীর হওয়া উচিত নয়। এটি একটি ডেটা সেট ক্ষেত্রে খুব দ্রুততর হয় যাতে প্রচুর কলাম রয়েছে (সম্ভবত অস্বীকৃত নেস্টেড ডেটা রয়েছে)। যাইহোক আপনাকে কম টাইপ করতে হবে :-)
বেরিলিয়াম

7

আপনি যদি df.count > 0। এটি সমস্ত এক্সিকিউটারের মধ্যে সমস্ত পার্টিশন গণনা করে এবং ড্রাইভার এ এগুলি যোগ করে। আপনি কয়েক মিলিয়ন সারি নিয়ে কাজ করার সময় কিছুটা সময় নেয়।

এটি করার সর্বোত্তম উপায় হ'ল এটি সম্পাদন করা df.take(1)এবং এটি নাল কিনা তা পরীক্ষা করা। java.util.NoSuchElementExceptionচেষ্টা করে দেখার জন্য এটি এত ভাল ফিরে আসবেdf.take(1)

take(1)খালি সারির পরিবর্তে সম্পন্ন করা হলে ডেটাফ্রেম একটি ত্রুটি ফেরায় । আমি নির্দিষ্ট কোড লাইনগুলি হাইলাইট করেছি যেখানে এটি ত্রুটি ছুঁড়ে ফেলেছে।

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


4
আপনি যদি লক্ষ লক্ষ রেকর্ডের সাথে একটি বিশাল ডেটাফ্রেমে এটি চালান তবে সেই countপদ্ধতিটি কিছুটা সময় নিতে চলেছে।
TheM00s3

4
আমি একই বলেছিলাম, আপনি কেন থাম্ব নিচু দিয়েছিলেন তা আমি নিশ্চিত নই।
নন্দাকিশোর

আপনার অধিকার আপনি একই কথা বলেছেন, দুর্ভাগ্যক্রমে, আমি আপনাকে নীচু করি নি।
TheM00s3

ওহ ঠিক আছে। আমি দুঃখিত, TheMoos3, কিন্তু যে কেউ এটি করেছে দয়া করে উত্তরটি পর্যবেক্ষণ করুন এবং ধারণাটি বুঝতে পারেন।
নন্দাকিশোর

4
@ লেটপ্লে ইয়াহটজি আমি উত্তরটি একই রান এবং চিত্রের সাথে আপডেট করেছি যা ত্রুটি দেখায়। (1) অ্যারে [সারি] প্রদান করে। এবং যখন অ্যারের কোনও মান থাকে না, ডিফল্টরূপে এটি অ্যারেআউটআউটবাউন্ড দেয়। সুতরাং আমি মনে করি না এটি একটি খালি সারি দেয়। আমি এটি পর্যবেক্ষণ এবং ভোট পরিবর্তন করতে বলব।
নন্দাকিশোর

5

জাভা ব্যবহারকারীদের জন্য আপনি এটি কোনও ডেটাসেটে ব্যবহার করতে পারেন:

public boolean isDatasetEmpty(Dataset<Row> ds) {
        boolean isEmpty;
        try {
            isEmpty = ((Row[]) ds.head(1)).length == 0;
        } catch (Exception e) {
            return true;
        }
        return isEmpty;
}

এটি সম্ভাব্য সমস্ত পরিস্থিতিতে (খালি, নাল) চেক করে।


4

স্কালায় আপনি এর মধ্যে জড়িত ব্যবহার করতে পারেন যোগ পদ্ধতি isEmpty()এবং nonEmpty()DataFrame এপিআই, যা কোড একটি বিট সুন্দর পড়তে করতে হবে হবে।

object DataFrameExtensions {
  implicit def extendedDataFrame(dataFrame: DataFrame): ExtendedDataFrame = 
    new ExtendedDataFrame(dataFrame: DataFrame)

  class ExtendedDataFrame(dataFrame: DataFrame) {
    def isEmpty(): Boolean = dataFrame.head(1).isEmpty // Any implementation can be used
    def nonEmpty(): Boolean = !isEmpty
  }
}

এখানে, অন্যান্য পদ্ধতি পাশাপাশি যুক্ত করা যেতে পারে। অন্তর্নিহিত রূপান্তরটি ব্যবহার করতে, import DataFrameExtensions._আপনি প্রসারিত কার্যকারিতাটি ব্যবহার করতে চান এমন ফাইলটিতে ব্যবহার করুন। এরপরে, পদ্ধতিগুলি সরাসরি হিসাবে ব্যবহার করা যেতে পারে:

val df: DataFrame = ...
if (df.isEmpty) {
  // Do something
}

3

আমার একই প্রশ্ন ছিল এবং আমি 3 টি মূল সমাধান পরীক্ষা করেছি:

  1. df! = নাল df.count> 0
  2. @ hulin003 হিসাবে df.head (1) .Empty ()
  3. @ জাস্টিন পিহোনির পরামর্শ অনুসারে df.rdd.isEmpty

এবং অবশ্যই 3 টি কাজগুলি যদিও পারফরম্যান্সের শর্তে, আমার মেশিনে একই ডিএফ-এ এই পদ্ধতিগুলি কার্যকর করার সময়, মৃত্যুদন্ড কার্যকর হওয়ার সময়কালে, আমি এখানে যা পেয়েছি তা এখানে:

  1. এটি ~ 9366ms লাগে
  2. এটি লাগে 60 5607ms
  3. এটি লাগে 21 1921ms

অতএব আমি মনে করি যে @ জাস্টিন পিহনি প্রস্তাবিত হিসাবে সেরা সমাধানটি df.rdd.isEmpty


4
বিকল্প 3 কম সময় লাগে, দ্বিতীয় কেন?
চিন্তাবিদ

উফস, আপনার ডান, আমি 3 য় ব্যবহার করছি, আমি প্রতিক্রিয়া আপডেট করি
এনেম

4
কৌতূহল ছাড়াই ... এটি কোন আকারের ডেটাফ্রেমগুলির সাথে পরীক্ষা করা হয়েছিল?
aiguofer

1

আমি খুঁজে পেয়েছি যে কিছু ক্ষেত্রে:

>>>print(type(df))
<class 'pyspark.sql.dataframe.DataFrame'>

>>>df.take(1).isEmpty
'list' object has no attribute 'isEmpty'

এটি "দৈর্ঘ্যের" জন্য সমান বা মাথা () দ্বারা টেক () প্রতিস্থাপন করুন

[সমাধান] যে সমস্যার জন্য আমরা ব্যবহার করতে পারি for

>>>df.limit(2).count() > 1
False


1

PySpark উপর, সেই জন্যই এই ব্যবহার করতে পারেন bool(df.head(1))একটি প্রাপ্ত করার Trueএর Falseমান

Falseডাটাফ্রেমে কোনও সারি না থাকলে এটি ফিরে আসে


0
df1.take(1).length>0

takeপদ্ধতি সারি অ্যারে ফেরৎ, তাই যদি অ্যারের আকার শূন্য সমান, সেখানে কোন রেকর্ড আছে df


-1

dataframe.limit(1).count > 0

এটি একটি কাজকেও ট্রিগার করে তবে যেহেতু আমরা একক রেকর্ড নির্বাচন করছি, এমনকি বিলিয়ন স্কেল রেকর্ডের ক্ষেত্রেও সময় ব্যয় অনেক কম হতে পারে।

থেকে: https://medium.com/checking-emptiness-in-distributes-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0


এইগুলি প্রায় সমান সময় নিচ্ছে খারাপ বিকল্পগুলি
পুষ্পেন্দ্র জয়সওয়াল

@ পুষ্পেন্দ্র জয়সওয়াল হ্যাঁ, এবং খারাপ বিকল্পের জগতে আমাদের সবচেয়ে ভাল খারাপ বিকল্পটি বেছে নেওয়া উচিত
জর্ডান মরিস

-2

আপনি এটি যেমন করতে পারেন:

val df = sqlContext.emptyDataFrame
if( df.eq(sqlContext.emptyDataFrame) )
    println("empty df ")
else 
    println("normal df")

4
এটি প্রয়োজন হবে না schemaদুই dataframes (এর sqlContext.emptyDataFrame& df) কি কখনো ফেরত করার জন্য একই true?
y2k-shubham

4
এটি কাজ করবে না। eqথেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় AnyRefএবং আর্গুমেন্টটি (যে) রিসিভার অবজেক্টের (এটি) কোনও রেফারেন্স কিনা তা পরীক্ষা করে।
আল্পার টি। টার্কার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.