Да, Шагун прав.
В принципе, когда вы отправляете искровое задание, которое искроет, оно не сериализует файл, который вы хотите обработать каждому работнику. Вам нужно будет сделать это самостоятельно.
Как правило, вам придется помещать файл в общую файловую систему, такую как HDFS, S3 (amazon) или любую другую DFS, к которой могут обращаться все рабочие. Как только вы это сделаете, и укажите место назначения файла в своем искровом сценарии, искровое задание сможет читать и обрабатывать по вашему желанию.
Однако, сказав это, копирование файла в тот же назначение во ВСЕХ ваших работников и файловая структура мастера также работают. Exp, вы можете создавать папки, такие как /opt/spark-job/all-files/
во всех искровых узлах, rsync
файл для всех них, а затем вы можете использовать файл в своем искровом скрипте. Но, пожалуйста, не делайте этого. DFS или S3 лучше, чем этот подход.
Нарезка не ограничена - проверяется встроенными типами. И хотя оба ваших примера, похоже, имеют одинаковый результат, они работают по-другому; попробуйте их со списком.
Для добавления ответа, который указывает на надежный раздел в документации :
Учитывая выражение среза, подобное s[i:j:k]
,
Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такая, что 0 & lt; = n & lt; (J-я) / к. Другими словами, индексы i, i + k, i + 2 * k, i + 3 * k и т. Д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, i и j сведены к len (s), если они больше
blockquote>, если вы пишете
s[999:9999]
, python возвращаетs[len(s):len(s)]
сlen(s) < 999
и ваш шаг (1
- значение по умолчанию).
k
положителен, i
и j
также увеличиваются до -len(s)
, когда они меньше? например s = 'bac'; s[-100:2] == s[-len(s):2]
– Chris_Rands
4 July 2017 в 12:56
k
положителен, Python будет масштабировать i
и j
так, чтобы они соответствовали границам последовательности. Например, в вашем примере s[-100:2] == s[0:2]
(== s[-len(s):2]
). Аналогично s[-100:100] == s[0:2]
.
– tylerc0816
18 August 2017 в 13:26
Вы в основном ответили на свой вопрос. Нарезка за пределами последовательности (по крайней мере для встроенных) не вызывает ошибки. Это имеет смысл, когда вы об этом думаете. Индексирование возвращает один элемент, но нарезка возвращает подпоследовательность элементов. Поэтому, когда вы пытаетесь индексировать несуществующее значение, ничего не вернуть; но когда вы вырезаете последовательность за пределами границ, вы все равно можете вернуть пустую последовательность.
Также обратите внимание, что есть различие между x[3]
и x[3:4]
. Например:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Причина, по которой они выглядят одинаково в случае строк, заключается в том, что не существует такой вещи, как отдельный символ за пределами строки; один символ - это всего лишь 1-символьная строка.
None
вместо ошибки - это обычное соглашение Python, когда вам нечего возвращать.
– Mark Ransom
29 February 2012 в 00:30
None
в этом случае будет сложнее рассказать между индексом вне пределов и значением None
внутри списка. Но даже если для этого было обходным путем, мне остается ясным, что возвращение пустой последовательности - это правильная вещь, когда нужно давать срезанный срез. Это аналогично выполнению объединения двух непересекающихся множеств.
– senderle
29 February 2012 в 00:49
None
в списке.
– Mark Ransom
29 February 2012 в 00:53