Untuk Spark 2.1.0, saran saya adalah menggunakan head(n: Int)
atau take(n: Int)
dengan isEmpty
, mana saja yang memiliki maksud paling jelas untuk Anda.
df.head(1).isEmpty
df.take(1).isEmpty
dengan padanan Python:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
Menggunakan df.first()
dan df.head()
akan mengembalikan java.util.NoSuchElementException
jika DataFrame kosong. first()
panggilan head()
langsung, yang memanggil head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
mengembalikan Array, jadi mengambil head
Array itu menyebabkan java.util.NoSuchElementException
kapan DataFrame kosong.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Jadi, alih-alih memanggil head()
, gunakan head(1)
langsung untuk mendapatkan array lalu Anda bisa menggunakan isEmpty
.
take(n)
juga setara dengan head(n)
...
def take(n: Int): Array[T] = head(n)
Dan limit(1).collect()
setara dengan head(1)
(perhatikan limit(n).queryExecution
dalam head(n: Int)
metode), jadi berikut ini semua setara, setidaknya dari apa yang saya tahu, dan Anda tidak perlu menangkap java.util.NoSuchElementException
pengecualian saat DataFrame kosong.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Saya tahu ini adalah pertanyaan lama, jadi semoga ini akan membantu seseorang yang menggunakan versi Spark yang lebih baru.
df.rdd.isEmpty
?df.head(1)
memakan banyak waktu, mungkin karenadf
rencana eksekusi Anda melakukan sesuatu yang rumit yang mencegah percikan mengambil jalan pintas. Misalnya, jika Anda hanya membaca dari file parketdf = spark.read.parquet(...)
, saya cukup yakin spark hanya akan membaca satu partisi file. Tetapi jika Andadf
melakukan hal-hal lain seperti agregasi, Anda mungkin secara tidak sengaja memaksa percikan untuk membaca dan memproses sebagian besar, jika tidak semua, data sumber Anda.df.limit(1).count()
naif. Pada kumpulan data besar, dibutuhkan lebih banyak waktu daripada contoh yang dilaporkan oleh @ hulin003 yang hampir seketikaSaya akan mengatakan untuk mengambil yang mendasarinya
RDD
. Di Scala:dengan Python:
Yang sedang berkata, semua ini adalah panggilan
take(1).length
, jadi itu akan melakukan hal yang sama seperti yang dijawab Rohan ... mungkin sedikit lebih eksplisit?sumber
Anda dapat memanfaatkan fungsi
head()
(ataufirst()
) untuk melihat apakahDataFrame
memiliki satu baris. Jika demikian, itu tidak kosong.sumber
Jika Anda melakukannya
df.count > 0
. Dibutuhkan jumlah semua partisi di semua pelaksana dan menambahkannya di Driver. Ini membutuhkan waktu lama ketika Anda berurusan dengan jutaan baris.Cara terbaik untuk melakukannya adalah dengan melakukan
df.take(1)
dan memeriksa apakah nilainya null. Ini akan kembalijava.util.NoSuchElementException
jadi lebih baik untuk mencobanyadf.take(1)
.Dataframe mengembalikan kesalahan saat
take(1)
selesai, bukan baris kosong. Saya telah menyoroti baris kode tertentu di mana ia melempar kesalahan.sumber
count
metode itu akan memakan waktu.Sejak Spark 2.4.0 ada
Dataset.isEmpty
.Itu implementasi adalah:
Perhatikan bahwa a
DataFrame
bukan lagi kelas di Scala, itu hanya alias tipe (mungkin diubah dengan Spark 2.0):sumber
Untuk pengguna Java, Anda dapat menggunakan ini di set data:
Ini memeriksa semua kemungkinan skenario (kosong, null).
sumber
Di Scala, Anda dapat menggunakan implik untuk menambahkan metode
isEmpty()
dannonEmpty()
ke DataFrame API, yang akan membuat kode sedikit lebih bagus untuk dibaca.Di sini, metode lain juga dapat ditambahkan. Untuk menggunakan konversi implisit, gunakan
import DataFrameExtensions._
file yang ingin Anda gunakan dengan fungsionalitas yang diperluas. Setelah itu, metode dapat digunakan secara langsung sebagai berikut:sumber
Saya memiliki pertanyaan yang sama, dan saya menguji 3 solusi utama:
dan tentu saja 3 berfungsi, namun dalam hal kinerja, inilah yang saya temukan, ketika menjalankan metode ini pada DF yang sama di mesin saya, dalam hal waktu eksekusi:
oleh karena itu saya pikir solusi terbaik adalah df.rdd.isEmpty seperti yang disarankan @Justin Pihony
sumber
Saya menemukan itu pada beberapa kasus:
ini sama untuk "length" atau ganti take () dengan head ()
[Solusi] untuk masalah yang bisa kita gunakan.
sumber
Jika Anda menggunakan Pypsark, Anda juga dapat melakukan:
sumber
Pada PySpark, Anda juga dapat menggunakan ini
bool(df.head(1))
untuk mendapatkanTrue
dariFalse
nilaiIa kembali
False
jika dataframe tidak berisi barissumber
The
take
Metode mengembalikan array baris, jadi jika ukuran array sama dengan nol, tidak ada catatan didf
.sumber
dataframe.limit(1).count > 0
Ini juga memicu pekerjaan tetapi karena kami memilih satu catatan, bahkan dalam kasus catatan skala miliar konsumsi waktu bisa jauh lebih rendah.
Dari: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
sumber
Anda bisa melakukannya seperti:
sumber
schema
dua dataframe (sqlContext.emptyDataFrame
&df
) untuk sama agar bisa kembalitrue
?eq
diwarisi dariAnyRef
dan menguji apakah argumen (itu) adalah referensi ke objek penerima (ini).