[apache-spark] Spark 데이터 프레임이 비어 있는지 확인하는 방법은 무엇입니까?

지금 은 비어 df.count > 0있는지 확인하는 데 사용해야 합니다 DataFrame. 그러나 그것은 비효율적입니다. 더 좋은 방법이 있습니까?

감사.

추신 : 비어 DataFrame있지 않은 경우 에만 저장하도록 비어 있는지 확인하고 싶습니다.



답변

Spark 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))

df.first()df.head()을 사용 java.util.NoSuchElementException하면 DataFrame이 비어 있는 경우 모두를 반환합니다 . first()호출 head()호출하는 직접 head(1).head.

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

head(1)Array를 반환하므로 head해당 Array를 사용하면 java.util.NoSuchElementExceptionDataFrame이 비어있을 때 발생합니다 .

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.NoSuchElementExceptionDataFrame가 비어있을 때 예외를.

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

나는 이것이 오래된 질문이라는 것을 알고 있으므로 새로운 버전의 Spark를 사용하는 사람에게 도움이되기를 바랍니다.


답변

나는 단지 기본 RDD. Scala에서 :

df.rdd.isEmpty

파이썬에서 :

df.rdd.isEmpty()

즉,이 모든 작업은 call take(1).length이므로 Rohan이 대답 한 것과 동일한 작업을 수행 할 것입니다.


답변

당신의 장점이 걸릴 수 있습니다 head()(또는 first()(가) 있는지 확인하기 위해) 기능을 DataFrame하나의 행이 있습니다. 그렇다면 비어 있지 않습니다.


답변

만약 당신이 df.count > 0. 모든 실행기에서 모든 파티션의 수를 가져 와서 Driver에서 합산합니다. 수백만 개의 행을 처리 할 때 시간이 걸립니다.

이를 수행하는 가장 좋은 방법 df.take(1)은 null인지 확인 하고 수행하는 것 입니다. 이것은 java.util.NoSuchElementException시도를하는 것이 더 나아질 것 df.take(1)입니다.

데이터 프레임 take(1)은 빈 행 대신 완료 되면 오류를 반환합니다 . 오류가 발생하는 특정 코드 줄을 강조 표시했습니다.

여기에 이미지 설명 입력


답변

Spark 2.4.0부터 Dataset.isEmpty.

그것의 구현 입니다 :

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

a DataFrame는 더 이상 Scala의 클래스가 아니라 유형 별칭 일뿐입니다 (아마도 Spark 2.0에서 변경됨).

type DataFrame = Dataset[Row]


답변

Java 사용자의 경우 데이터 세트에서 이것을 사용할 수 있습니다.

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

가능한 모든 시나리오를 확인합니다 (empty, null).


답변

Scala에서는 암시 적을 사용 하여 메서드 와 DataFrame API 를 추가 할 수 있습니다 . 이렇게하면 코드를 좀 더 읽기 쉽게 만들 수 있습니다.isEmpty()nonEmpty()

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
}