এখনই, আমাকে খালি আছে df.count > 0
কিনা তা পরীক্ষা করতে আমাকে ব্যবহার করতে হবে DataFrame
। তবে এটি একরকম অদক্ষ। এটি করার আরও ভাল উপায় আছে কি?
ধন্যবাদ
PS: আমি এটি খালি কিনা তা যাচাই করতে চাই যাতে DataFrame
এটি খালি না হলে কেবলমাত্র সংরক্ষণ করি
উত্তর:
স্পার্ক ২.১.০ এর জন্য, আমার পরামর্শটি হ'ল যে কোনওটি আপনার কাছে সুস্পষ্ট অভিপ্রায় ব্যবহার করে 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
আমি জানি এটি একটি পুরানো প্রশ্ন তাই আশা করি এটি স্পার্কের নতুন সংস্করণ ব্যবহার করে এমন কাউকে সহায়তা করবে।
df.rdd.isEmpty
?
df.head(1)
প্রচুর সময় নিচ্ছেন তবে সম্ভবত আপনার df
বাস্তবায়ন পরিকল্পনাটি এমন জটিল কিছু করছে যা স্পার্ককে শর্টকাট নিতে বাধা দেয়। উদাহরণস্বরূপ, আপনি যদি parquet ফাইলগুলি থেকে কেবল পড়ছেন df = spark.read.parquet(...)
, তবে আমি নিশ্চিত যে স্পার্ক কেবল একটি ফাইল পার্টিশন পড়বে read তবে যদি আপনি df
অন্যান্য কাজগুলি যেমন একীকরণের কাজ করে থাকেন তবে অসাবধানতাবশত আপনি উত্সের ডেটাগুলির সমস্ত কিছু না থাকলে একটি বড় অংশ পড়তে ও প্রসেস করার জন্য অবিস্মরণীয়ভাবে চাপ দিতে বাধ্য করছেন।
df.limit(1).count()
। বড় ডেটাসেটগুলিতে এটি @ হুলিন ২০০3 দ্বারা উল্লিখিত উদাহরণগুলির তুলনায় অনেক বেশি সময় নেয় যা প্রায় তাত্ক্ষণিক
আমি কেবল অন্তর্নিহিত দখল করতে বলব RDD
। স্কালায়:
df.rdd.isEmpty
পাইথনে:
df.rdd.isEmpty()
বলা হচ্ছে যে, এইগুলি সবই কল take(1).length
, তাই এটি রোহানের জবাব হিসাবে একই কাজ করবে ... সম্ভবত কিছুটা আরও স্পষ্টভাবে বলা যেতে পারে?
এক head()
(এক first()
) DataFrame
সারি রয়েছে কিনা তা দেখতে আপনি (বা ) ফাংশনগুলির সুবিধা নিতে পারেন । যদি তা হয়, এটি খালি নয়।
যেহেতু স্পার্ক ২.৪.০ রয়েছে Dataset.isEmpty
।
এটি বাস্তবায়ন হ'ল:
def isEmpty: Boolean =
withAction("isEmpty", limit(1).groupBy().count().queryExecution) { plan =>
plan.executeCollect().head.getLong(0) == 0
}
মনে রাখবেন যে DataFrame
স্কালায় এখন আর কোনও শ্রেণি নেই, এটি কেবল একটি টাইপ ওরফে (সম্ভবত স্পার্ক ২.০ দিয়ে পরিবর্তিত হয়েছে):
type DataFrame = Dataset[Row]
আপনি যদি df.count > 0
। এটি সমস্ত এক্সিকিউটারের মধ্যে সমস্ত পার্টিশন গণনা করে এবং ড্রাইভার এ এগুলি যোগ করে। আপনি কয়েক মিলিয়ন সারি নিয়ে কাজ করার সময় কিছুটা সময় নেয়।
এটি করার সর্বোত্তম উপায় হ'ল এটি সম্পাদন করা df.take(1)
এবং এটি নাল কিনা তা পরীক্ষা করা। java.util.NoSuchElementException
চেষ্টা করে দেখার জন্য এটি এত ভাল ফিরে আসবেdf.take(1)
।
take(1)
খালি সারির পরিবর্তে সম্পন্ন করা হলে ডেটাফ্রেম একটি ত্রুটি ফেরায় । আমি নির্দিষ্ট কোড লাইনগুলি হাইলাইট করেছি যেখানে এটি ত্রুটি ছুঁড়ে ফেলেছে।
count
পদ্ধতিটি কিছুটা সময় নিতে চলেছে।
জাভা ব্যবহারকারীদের জন্য আপনি এটি কোনও ডেটাসেটে ব্যবহার করতে পারেন:
public boolean isDatasetEmpty(Dataset<Row> ds) {
boolean isEmpty;
try {
isEmpty = ((Row[]) ds.head(1)).length == 0;
} catch (Exception e) {
return true;
}
return isEmpty;
}
এটি সম্ভাব্য সমস্ত পরিস্থিতিতে (খালি, নাল) চেক করে।
স্কালায় আপনি এর মধ্যে জড়িত ব্যবহার করতে পারেন যোগ পদ্ধতি 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 টি কাজগুলি যদিও পারফরম্যান্সের শর্তে, আমার মেশিনে একই ডিএফ-এ এই পদ্ধতিগুলি কার্যকর করার সময়, মৃত্যুদন্ড কার্যকর হওয়ার সময়কালে, আমি এখানে যা পেয়েছি তা এখানে:
অতএব আমি মনে করি যে @ জাস্টিন পিহনি প্রস্তাবিত হিসাবে সেরা সমাধানটি df.rdd.isEmpty
আমি খুঁজে পেয়েছি যে কিছু ক্ষেত্রে:
>>>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
আপনি যদি পাইপসার্ক ব্যবহার করেন তবে আপনি এটি করতেও পারেন:
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
দুই dataframes (এর sqlContext.emptyDataFrame
& df
) কি কখনো ফেরত করার জন্য একই true
?
eq
থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় AnyRef
এবং আর্গুমেন্টটি (যে) রিসিভার অবজেক্টের (এটি) কোনও রেফারেন্স কিনা তা পরীক্ষা করে।