В моем случае я использовал одноэлементный класс, который может работать как глобальный объект, позволяющий получать доступ к данным почти везде в приложении. Прежде всего, нужно построить одноэлементный класс. Пожалуйста, обратитесь к странице, «. Как выглядит мой сингл Objective-C? « И то, что я сделал, чтобы сделать объект глобально доступным, просто импортировал его в appName_Prefix.pch
, который предназначен для применения оператора импорта в все классы. Чтобы получить доступ к этому объекту и использовать его, я просто применил метод класса для возврата общего экземпляра, который содержит свои собственные переменные
Вы можете использовать функции head()
(или first()
), чтобы увидеть, имеет ли DataFrame
одну строку. Если это так, это не пусто.
Для пользователей Java вы можете использовать это в наборе данных:
public boolean isDatasetEmpty(Dataset<Row> ds) {
boolean isEmpty;
try {
isEmpty = ((Row[]) ds.head(1)).length == 0;
} catch (Exception e) {
return true;
}
return isEmpty;
}
Это проверяет все возможные сценарии (пустые, нулевые).
df1.take(1).length>0
Метод take
возвращает массив строк, поэтому, если размер массива равен нулю, в df
нет записей.
Если вы делаете «df.count> 0». Он учитывает количество всех разделов для всех исполнителей и добавляет их в Driver. Это займет некоторое время, когда вы имеете дело с миллионами строк.
Лучший способ сделать это - выполнить «df.take (1)» и проверить, является ли его нулевым. Это вернет «java.util.NoSuchElementException», поэтому лучше попробовать «df.take (1)».
. Dataframe возвращает ошибку, когда take (1) выполняется вместо пустой строки , Я выделил конкретные строки кода, где он выдает ошибку.
В Scala вы можете использовать implicits для добавления методов isEmpty()
и nonEmpty()
в API DataFrame, что сделает код более приятным для чтения.
object DataFrameExtensions {
implicit def extendedDataFrame(dataFrame: DataFrame): ExtendedDataFrame =
new ExtendedDataFrame(dataFrame: DataFrame)
class ExtendedDataFrame(dataFrame: DataFrame) {
def isEmpty(): Boolean = {
Try{dataFrame.first.length != 0} match {
case Success(_) => false
case Failure(_) => true
}
}
def nonEmpty(): Boolean = !isEmpty
}
}
Здесь другие методы также могут быть добавлены. Чтобы использовать неявное преобразование, используйте import DataFrameExtensions._
в файле, который вы хотите использовать расширенную функциональность. Впоследствии методы могут использоваться непосредственно так:
val df: DataFrame = ...
if (df.isEmpty) {
// Do something
}
Я обнаружил, что в некоторых случаях:
>>>print(type(df))
<class 'pyspark.sql.dataframe.DataFrame'>
>>>df.take(1).isEmpty
'list' object has no attribute 'isEmpty'
это то же самое для «length» или replace take () head ()
[Solution] для проблемы, которую мы можно использовать.
>>>df.limit(2).count() > 1
False
Вы можете сделать это как:
val df = sqlContext.emptyDataFrame
if( df.eq(sqlContext.emptyDataFrame) )
println("empty df ")
else
println("normal df")
Я бы сказал, чтобы просто захватить базовый RDD
. В Scala:
df.rdd.isEmpty
в Python:
df.rdd.isEmpty()
Говоря все это, это вызов take(1).length
, поэтому он будет делать то же, что ответил Рохан ... возможно, немного более явным?