Обновление:
С текущими версиями вы можете использовать array
литералов:
from pyspark.sql.functions import array, lit
df.where(df.a == array(*[lit(x) for x in ['list','of' , 'stuff']]))
Оригинальный ответ:
Ну, немного хакерский способ сделать это, который не требует пакетного задания Python, выглядит примерно так:
from pyspark.sql.functions import col, lit, size
from functools import reduce
from operator import and_
def array_equal(c, an_array):
same_size = size(c) == len(an_array) # Check if the same size
# Check if all items equal
same_items = reduce(
and_,
(c.getItem(i) == an_array[i] for i in range(len(an_array)))
)
return and_(same_size, same_items)
Быстрая проверка:
df = sc.parallelize([
(1, ['list','of' , 'stuff']),
(2, ['foo', 'bar']),
(3, ['foobar']),
(4, ['list','of' , 'stuff', 'and', 'foo']),
(5, ['a', 'list','of' , 'stuff']),
]).toDF(['id', 'a'])
df.where(array_equal(col('a'), ['list','of' , 'stuff'])).show()
## +---+-----------------+
## | id| a|
## +---+-----------------+
## | 1|[list, of, stuff]|
## +---+-----------------+
Реализации могут отличаться, но существуют некоторые основные идеи, которые следуют из требований.
сам объект исключения является объектом, созданным в одной функции, уничтоженной в вызывающей стороне этого. Следовательно, обычно не выполнимо создать объект на стеке. С другой стороны, много объектов исключения не являются очень большими. Следовательно, можно создать, например, 32-байтовый буфер и переполнение к "куче", если больший объект исключения на самом деле необходим.
Что касается фактической передачи управления, две стратегии существуют. Нужно записать достаточно информации в самом стеке для раскручивания стека. Это - в основном список деструкторов для выполнения и обработчики исключений, которые могли бы поймать исключение. Когда исключение происходит, отбегите стек, выполняющий те деструкторы, пока Вы не находите выгоду соответствия.
вторая стратегия перемещает эту информацию в таблицы вне стека. Теперь, когда исключение происходит, стек вызовов используется для обнаружения, какие объемы введены, но не выходятся. Они затем ищутся в статических таблицах для определения, где вызванная исключительная ситуация будет обработана, и который деструкторы, выполненные промежуточный. Это означает, что существует меньше исключения наверху на стеке; обратные адреса необходимы так или иначе. Таблицы являются дополнительными данными, но компилятор может поместить их в загруженный спросом сегмент программы.
Это определяется в 15.1 Выдаче исключения стандарта.
бросок создает временный объект.
то, Как память для этого временного объекта выделяется, является неуказанным.
После того, как создание управления временным объектом передается самому близкому обработчику в стеке вызовов. раскручивание стека между броском и точкой выгоды. Поскольку стек, раскручиваются, любые переменные стека уничтожаются в обратном порядке создания.
, Если исключение не повторно брошено, временный файл уничтожается в конце обработчика, где это было поймано.
Примечание: Если Вы поймаете ссылкой, то ссылка будет относиться к временному файлу, Если Вы поймаете значением, временный объект копируется в значение (и таким образом требует конструктора копии).
Совет от S.Meyers (Выгода ссылкой константы).
try
{
// do stuff
}
catch(MyException const& x)
{
}
catch(std::exception const& x)
{
}
Вы могли смотреть здесь для подробного объяснения.
Это может также помочь смотреть на прием, используемый в плоскости C для реализации некоторого основного вида обработки исключений. Это влечет за собой использование setjmp () и longjmp () следующим образом: первый сохраняет стек для маркировки обработчика исключений (как "выгода"), в то время как последний используется для "бросания" значения. "Брошенное" значение замечено, как будто оно было возвращено из вызванной функции. "Блок попытки" заканчивается, когда setjmp () называют снова или когда функция возвращается.