Ваш код почти близок к лучшему подходу, но я все же попытался добавить несколько вещей -
1. Рассчитать «top» один раз и использовать его для сравнения.
2.Используйте отдельное определение столбца, это поможет улучшить удобочитаемость и удобство обслуживания.
from pyspark.sql.window import Window
windowSpec = Window.partitionBy('Day')
top = max('sensitive_id').over(windowSpec).alias('top')
df.select('Day','Num','sensitive_id',top).withColumn('top_sensitive_id', expr("CASE WHEN sensitive_id = top THEN top END")).show()
Поскольку JSON.stringify в последнее время поставляется с некоторыми браузерами, я бы предложил использовать его вместо прототипа toJSON. Затем вы должны проверить window.JSON && window.JSON.stringify и включить только библиотеку json.org в противном случае (через document.createElement ('script')
…). Чтобы устранить несовместимость, используйте:
if(window.Prototype) {
delete Object.prototype.toJSON;
delete Array.prototype.toJSON;
delete Hash.prototype.toJSON;
delete String.prototype.toJSON;
}
Я не настолько быстр с Прототипом, но я видел это в его документах:
Object.toJSON({"a":[1,2]})
Я не уверен, имело ли это ту же проблему, текущее кодирование имеет, все же.
Существует также более длинное учебное руководство об использовании JSON с Прототипом.
Вот то, как я имею дело с ним.
var methodCallString = Object.toJSON? Object.toJSON(options.jsonMethodCall) : JSON.stringify(options.jsonMethodCall);
Я думаю, что лучшим решением было бы включить это сразу после загрузки прототипа
JSON = JSON || {};
JSON.stringify = function(value) { return value.toJSON(); };
JSON.parse = JSON.parse || function(jsonsring) { return jsonsring.evalJSON(true); };
Это делает функцию прототипа доступной как стандартные JSON.stringify () и JSON.parse (), но сохраняет собственный JSON.parse (), если он доступен, что делает его более совместимым со старыми браузерами.
Люди уже привели причины, по которым я обычно выручаю: старый (больше не применимый к большинству компиляторов) аргумент о том, чтобы не включать stdlib.h
и использовать sizeof * p
, чтобы убедиться, что типы и размеры всегда совпадают независимо от последующего обновления. Я хочу указать еще на один аргумент против кастинга. Он маленький, но я думаю, он применим.
C довольно слабо набран. Большинство преобразований безопасного типа происходит автоматически, а для большинства небезопасных требуется приведение. Рассмотрим:
int from_f(float f)
{
return *(int *)&f;
}
Это опасный код. Это технически неопределенное поведение, хотя на практике оно будет делать то же самое почти на каждой платформе, на которой вы его запускаете. А актёрский состав помогает сказать вам "Этот код - ужасный взлом".
Подумайте:
int *p = (int *)malloc(sizeof(int) * 10);
Я вижу актёрский состав, и мне интересно: "Зачем это нужно? Где взлом? Это поднимает волосы на моей шее, что происходит что-то зло, когда на самом деле код совершенно безвреден.
Пока мы используем C, слепки (особенно слепки указателей) - это способ сказать: «Здесь происходит что-то злое и легко разрушаемое». Они могут достичь того, что вам нужно, но они указывают вам и будущим сопровождающим, что дети не в порядке.
Использование слепков на каждом маллоке
уменьшает индикацию «взлома» при показании указателя. Это делает менее страшным видеть такие вещи, как * (int *) & f;
.
Примечание: C и C++ - разные языки. C слабо типизируется, C++ более сильно типизируется. Слепки необходимы в C++, даже если они вообще не указывают на взлом, из-за (на мой скромный взгляд) излишне сильной системы типа C++. (Действительно, этот конкретный случай - единственное место, где, я думаю, система типа C++ «слишком сильна», но я не могу придумать место, где она «слишком слаба», что делает ее в целом слишком сильной для моих вкусов.)
Если вы беспокоитесь о совместимости C++, не стоит. Если вы пишете C, используйте компилятор C. Есть много действительно хороших, доступных для каждой платформы. Если по какой-то странной причине у вас есть для записи кода C, который компилируется чисто как C++, вы на самом деле не пишете C. Если вам нужно портировать C на C++, вы должны внести много изменений, чтобы сделать ваш код C более идиоматичным C++.
Если вы не можете сделать ничего из этого, ваш код не будет довольно независимо от того, что вы делаете, так что на самом деле не важно, как вы решите сделать в этот пункт. Мне нравится идея использования шаблонов для создания нового распределителя, который возвращает правильный тип, хотя это в основном просто переосмысление ключевого слова new
.
Изменить, чтобы сделать несколько более точным:
Бит ключа проблемы находится в библиотеке JSON из JSON.org (и других реализациях объекта JSON ECMAScript 5):
if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); }
Проблема в том, что библиотека Prototype расширяет массив, чтобы включить метод toJSON, который JSON Когда объект JSON достигает значения массива, вызываемого toJSON для массива, определенного в Prototype,и этот метод возвращает последовательности версию массива. Следовательно, кавычки вокруг скобок массива.
При удалении toJSON из объекта Array библиотека JSON должна работать правильно. Или просто используйте библиотеку JSON.