जवाबों:
स्पार्क 2.1.0 के लिए, मेरे सुझाव का उपयोग करना होगा 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))
यदि DataFrame खाली है , तो इसका उपयोग करना 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
मुझे पता है कि यह एक पुराना सवाल है, इसलिए उम्मीद है कि यह स्पार्क के नए संस्करण का उपयोग करने में किसी की मदद करेगा।
df.rdd.isEmpty
?
df.head(1)
बड़ी मात्रा में समय ले रहे हैं, तो यह शायद इसलिए है क्योंकि आपकी df
निष्पादन योजना कुछ जटिल कर रही है जो चिंगारी को शॉर्टकट लेने से रोकती है। उदाहरण के लिए, यदि आप सिर्फ लकड़ी की छत फ़ाइलों से पढ़ रहे हैं df = spark.read.parquet(...)
, मुझे पूरा यकीन है कि स्पार्क केवल एक फ़ाइल विभाजन को पढ़ेगा। लेकिन अगर आपकी df
अन्य चीजें एकत्रीकरण की तरह कर रही हैं, तो आप अनजाने में स्पार्क को पढ़ने और एक बड़े हिस्से को संसाधित करने के लिए मजबूर हो सकते हैं, यदि सभी नहीं, तो आप स्रोत डेटा।
df.limit(1).count()
भोलेपन का उपयोग कर रहा था । बड़े डेटासेट पर @ hulin003 द्वारा रिपोर्ट किए गए उदाहरणों की तुलना में बहुत अधिक समय लगता है जो लगभग तात्कालिक हैं
मैं सिर्फ अंतर्निहित हड़पने के लिए कहूंगा RDD
। स्काला में:
df.rdd.isEmpty
पायथन में:
df.rdd.isEmpty()
यह कहा जा रहा है, यह सब करता है कॉल take(1).length
, तो यह रोहन के जवाब के रूप में एक ही बात करेंगे ... बस थोड़ा और अधिक स्पष्ट हो सकता है?
आप यह देखने के लिए head()
(या first()
) फ़ंक्शन का लाभ उठा सकते हैं कि DataFrame
क्या एक एकल पंक्ति है। यदि हां, तो यह खाली नहीं है।
यदि आप करते हैं df.count > 0
। यह सभी निष्पादकों में सभी विभाजनों की गिनती लेता है और उन्हें चालक में जोड़ देता है। यह तब होता है जब आप लाखों पंक्तियों के साथ काम कर रहे होते हैं।
ऐसा करने का सबसे अच्छा तरीका प्रदर्शन करना है df.take(1)
और जांचना है कि क्या इसकी अशक्तता है। यह java.util.NoSuchElementException
एक कोशिश चारों ओर लगाने के लिए बेहतर वापस आ जाएगी df.take(1)
।
take(1)
खाली पंक्ति के बजाय डेटाफ़्रेम एक त्रुटि देता है। मैंने विशिष्ट कोड लाइनों को हाइलाइट किया है जहां यह त्रुटि फेंकता है।
count
कुछ समय लगने वाला है।
चूंकि स्पार्क 2.4.0 है Dataset.isEmpty
।
यह कार्यान्वयन है:
def isEmpty: Boolean =
withAction("isEmpty", limit(1).groupBy().count().queryExecution) { plan =>
plan.executeCollect().head.getLong(0) == 0
}
ध्यान दें कि DataFrame
अब स्काला में एक वर्ग नहीं है, यह सिर्फ एक प्रकार का उपनाम है (शायद स्पार्क 2.0 के साथ बदल गया है):
type DataFrame = Dataset[Row]
जावा उपयोगकर्ताओं के लिए आप इसे डेटासेट पर उपयोग कर सकते हैं:
public boolean isDatasetEmpty(Dataset<Row> ds) {
boolean isEmpty;
try {
isEmpty = ((Row[]) ds.head(1)).length == 0;
} catch (Exception e) {
return true;
}
return isEmpty;
}
यह सभी संभावित परिदृश्यों (खाली, अशक्त) की जाँच करता है।
Scala में आप विधियों को जोड़ने के लिए isEmpty()
और nonEmpty()
DataFrame API का उपयोग कर सकते हैं , जो कोड को पढ़ने के लिए थोड़ा अच्छा बना देगा।
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 काम करता है, हालांकि शब्दावलियों की अवधि में, यहां वही है जो मैंने पाया है, जब इन तरीकों को मेरी मशीन में उसी DF पर निष्पादित करते समय, निष्पादन के समय में:
इसलिए मुझे लगता है कि सबसे अच्छा समाधान df.rdd.isEmpty @Justin Pihony सुझाव है
मैंने पाया कि कुछ मामलों पर:
>>>print(type(df))
<class 'pyspark.sql.dataframe.DataFrame'>
>>>df.take(1).isEmpty
'list' object has no attribute 'isEmpty'
यह "लंबाई" के लिए समान है या सिर द्वारा ले () बदलें
[समाधान] इस मुद्दे के लिए हम उपयोग कर सकते हैं।
>>>df.limit(2).count() > 1
False
यदि आप Pypsark का उपयोग कर रहे हैं, तो आप भी कर सकते हैं:
len(df.head(1)) > 0
dataframe.limit(1).count > 0
यह एक नौकरी भी चलाता है लेकिन जब से हम एकल रिकॉर्ड का चयन कर रहे हैं, तब भी अरब पैमाने के रिकॉर्ड के मामले में समय की खपत बहुत कम हो सकती है।
आप इसे कर सकते हैं जैसे:
val df = sqlContext.emptyDataFrame
if( df.eq(sqlContext.emptyDataFrame) )
println("empty df ")
else
println("normal df")
schema
दो डेटाफ्रेम ( sqlContext.emptyDataFrame
& df
) के समान होने की आवश्यकता नहीं होगी true
?
eq
से विरासत में मिला है AnyRef
और परीक्षण करता है कि क्या तर्क (वह) रिसीवर ऑब्जेक्ट (यह) का संदर्भ है।