Я думаю, что вы можете искать функции окна: http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=window#pyspark.sql. Окно
https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
Вот пример в Scala (теперь у меня нет Spark Shell с Hive, поэтому я не смог проверить код, но я думаю, что он должен работать):
case class MyRow(name: String, id_sa: String, id_sb: String)
val myDF = sc.parallelize(Array(
MyRow("n1", "a1", "b1"),
MyRow("n2", "a1", "b2"),
MyRow("n3", "a1", "b2"),
MyRow("n1", "a2", "b2")
)).toDF("name", "id_sa", "id_sb")
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy(myDF("id_sa")).orderBy(myDF("id_sb").desc)
myDF.withColumn("max_id_b", first(myDF("id_sb")).over(windowSpec).as("max_id_sb")).filter("id_sb = max_id_sb")
Вероятно, есть более эффективные способы достижения тех же результатов с помощью функций Window, но я надеюсь, что это указывает на правильное направление.
C # имеет только буквальные значения true
и false
.
C # требует, чтобы вы были очень явными в своих декларациях, поскольку это язык со строгой типизацией, в отличие от JavaScript, который может при необходимости выполнять неявные преобразования.
Важно отметить, что «строгая типизация» не является причиной, по которой C # неявно не преобразуется в значения «истинность / ложь». Язык намеренно пытается избежать ловушек в других скомпилированных языках, таких как C ++, где определенные значения могут быть достоверными, например, «0
» или «1
», которые могут позволить вам сделать синтаксическую ошибку, которую вы можете не заметить до времени выполнения, когда ваш код ведет себя неожиданно.
По умолчанию C # предоставляет только true
и false
.
Однако, вы можете иметь свои собственные пользовательские типы, становящиеся «истинными» и «ложными», реализуя оператор true
. Когда тип реализует оператор true
, экземпляры этого типа могут использоваться как логическое выражение. Из раздела 7.19 Спецификации языка C # :
Когда логическое выражение имеет тип, который не может быть неявно преобразован в bool, но реализует оператор true, после оценки expression, оператор true, предоставляемый этим типом, вызывается для получения значения bool.
Тип структуры
DBBool
в §11.4.2 предоставляет пример типа, который реализует оператор true и оператор false.
Вот фрагмент кода объявления оператора true
(который, вероятно, выполнит то, что вы хотели сделать в своем вопросе):
public static bool operator true(MyType myInstance)
{
return myInstance != null;
}
Если вы реализуете true
, то вы должны также реализовать оператор false
.
Краткий ответ:
В C #:
Все остальное не является логическим значением.
Подобный код будет (и должен) не компилироваться. Если вы хотите переопределить это поведение, вы можете создать неявное преобразование в логическое значение. Примерно так:
public class Foo {
public static implicit operator bool(Foo me) {
if (me == null) {
return false;
}
return true; // maybe add more logic before saying True
}
}
Я бы назвал это плохой практикой, потому что для программиста, не знакомого с вашим проектом, не сразу понятно, какая логика обеспечивает логическое преобразование. Более идиоматический способ сделать это - явно рассказать читателю, что делает ваш код, как это делает встроенный класс String, с помощью статической вспомогательной функции:
if (String.IsNullOrEmpty(str){
// ...
}
Код пишется только один раз, и читаю часто; оптимизировать для удобства чтения.
Правильный ответ на ваш вопрос находится в разделе 7.19 спецификации C # 3.0, которую вы легко найдете в Интернете. Для вашего удобства, соответствующий текст:
7.19 Булевы выражения
Булево-выражение - это выражение, которое дает результат типа bool.
Управляющим условным выражением оператора if [...] является логическое выражение. [...]
Булево выражение должно иметь тип, который может быть неявно преобразован в bool, или тип, который реализует оператор true. Если ни одно из требований не выполнено, возникает ошибка времени компиляции.
Если логическое выражение имеет тип, который не может быть неявно преобразован в bool, но реализует оператор true, то после вычисления выражения вызывается реализация оператора true, предоставляемая этим типом, для получения значения bool.
Нет никаких других типов, кроме самого bool, которые неявно преобразуются в bool посредством встроенного преобразования, но, конечно, пользовательские неявные преобразования в bool могут быть определены пользователем.
C # - статически типизированный язык, то есть тип объектов имеет значение при настройке, что это такое.
Например, «4»! = 4.
JavaScript, однако, является языком с динамической типизацией, поэтому типы не имеют большого значения.
Так в JavaScript «4» == 4.
«Истинные» значения - это значения, которые просто удовлетворяют x == true, в то время как «ложные» значения - нет.
Без безопасности типов некоторые функции, такие как перегрузка, приведут к непредсказуемому поведению.
Для получения дополнительной информации, вы можете увидеть здесь .
Оператор if вычисляет что-то, что может быть преобразовано в / равно / возвращает логическое значение или само логическое значение ... проверка на нулевое значение, например, obj! = Null, является одним из таких выражений,
'if (obj ) 'может работать, только если obj способен конвертировать в bool, а не если он нулевой.
Если obj
является типом, который вы создали, вы можете определить пользовательское неявное преобразование в bool
.
Вы можете определить свою собственную правду и ложь с помощью методов расширения.
public static bool Falsy(this object obj) {
if(obj == null) return true;
if (obj is string)
if(obj as string == string.Empty) return true;
if(obj is byte)
if((byte)obj == 0) return true;
if(obj is sbyte)
if((sbyte)obj == 0) return true;
if(obj is short)
if((short)obj == 0) return true;
if(obj is ushort)
if((ushort)obj == 0) return true;
if(obj is int)
if((int)obj == 0) return true;
if(obj is uint)
if((uint)obj == 0) return true;
if(obj is long)
if((long)obj == 0) return true;
if(obj is ulong)
if((ulong)obj == 0) return true;
if(obj is float)
if((float)obj == 0) return true;
if(obj is double)
if((double)obj == 0) return true;
if(obj is decimal)
if((decimal)obj == 0) return true;
if(obj is IEnumerable<object>)
if((obj as IEnumerable<object>).Count<object>() == 0)
return true;
if(obj is Array)
if(((Array)obj).Length <= 0)
return true;
if(obj is ObjectId)
if(((ObjectId)obj).Pid == 0) return true;
if(obj is System.Collections.ObjectModel.ObservableCollection<M>)
if(((ObservableCollection<M>)obj).Count <= 0) return true;
return false;
}
public static bool Truthy(this object obj) {
return !Falsy(obj);
}
Таким образом, вы можете сделать что-то вроде:
if (customerList.Falsy ()) {throw new Exception («Не может быть нулевым или пустым.»); }
Предыдущий ответ правильный. Однако у меня есть метод расширения, который я использую в некоторых редких случаях:
public static bool IsTruthy(this object obj)
{
if (obj == null || obj is DBNull)
return false;
var str = obj as string;
if (str != null)
return !string.IsNullOrWhiteSpace(str) &&
!str.Trim().Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase);
try
{
if (Convert.ToDecimal(obj) == 0)
return false;
}
catch { }
if (obj is BigInteger)
return ((BigInteger)obj) != 0;
return true;
}
Некоторые примечания по этому поводу: