Я знаю, что это избитый предмет, но для тех, кто хочет ответить на этот вопрос с наклоном SWIFT и хочет пример с голубыми костями, вот мой метод go-to для передачи данных, если вы используете segue, чтобы обойти.
Это похоже на вышесказанное, но без кнопок, меток и т. д. Просто передавайте данные с одного вида на другой.
Настройка Раскадровка
Есть три части.
Это очень простой макет представления с segue между ними.
Вот настройка для отправителя
Вот настройка приемника.
Наконец, настройка для сеанса.
Контроллеры просмотра
Мы придерживаемся этого простого поэтому никаких кнопок, а не действий, мы просто перемещаем данные от отправителя к получателю, когда приложение загружается, а затем выводит переданное значение на консоль.
Эта страница берет первоначально загруженное значение и передает его .
//
// ViewControllerSender.swift
// PassDataBetweenViews
//
// Created by Chris Cantley on 8/25/15.
// Copyright (c) 2015 Chris Cantley. All rights reserved.
//
import UIKit
class ViewControllerSender: UIViewController {
// THE STUFF - put some info into a variable
let favoriteMovie = "Ghost Busters"
override func viewDidAppear(animated: Bool) {
// PASS IDENTIFIER - go to the recieving view controller.
self.performSegueWithIdentifier("goToReciever", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//GET REFERENCE - ...to the receiver view.
var viewControllerReceiver = segue.destinationViewController as? ViewControllerReceiver
//PASS STUFF - pass the variable along to the target.
viewControllerReceiver!.yourFavMovie = self.favoriteMovie
}
}
Эта страница просто отправляет значение переменной на консоль при ее загрузке. К этому моменту наш любимый фильм должен быть в этой переменной.
//
// ViewControllerReceiver.swift
// PassDataBetweenViews
//
// Created by Chris Cantley on 8/25/15.
// Copyright (c) 2015 Chris Cantley. All rights reserved.
//
import UIKit
class ViewControllerReceiver: UIViewController {
//Basic empty variable waiting for you to pass in your fantastic favorite movie.
var yourFavMovie = ""
override func viewDidLoad() {
super.viewDidLoad()
//And now we can view it in the console.
println("The Movie is \(self.yourFavMovie)")
}
}
Вот как вы можете справиться с этим, если хотите использовать segue, и у вас нет страниц под навигационным контроллером.
После запуска он должен автоматически переключиться на вид приемника и передать значение от отправителя в приемник, отображая значение в консоли.
Вы можете использовать функции 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
, поэтому он будет делать то же, что ответил Рохан ... возможно, немного более явным?
Для Spark 2.1.0 моим предложением было бы использовать head(n: Int)
или take(n: Int)
с isEmpty
, в зависимости от того, что имеет самое ясное намерение для вас.
df.head(1).isEmpty
df.take(1).isEmpty
с эквивалентом Python:
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)
возвращает массив, поэтому, принимая head
в этом массиве, вызывает java.util.NoSuchElementException
, когда DataFrame пуст .
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Поэтому вместо вызова head()
используйте head(1)
непосредственно, чтобы получить массив, а затем вы можете использовать isEmpty
.
take(n)
также эквивалентно to 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
Я знаю, что это более старый вопрос, поэтому, надеюсь, это поможет кому-то, кто использует новый версия Spark.