У меня было похожее состояние, когда у меня было несколько объединений, и в конце мне пришлось записать окончательный кадр данных в таблицу HDFS / Hive (формат Parquet).
Spark работает над механизмом Lazy Execution, который означает, что когда ваш 53-й кадр данных активирован (Сохранить / записать как паркет), Spark затем возвращается ко всем соединениям и выполняет их, что вызывает огромную перетасовку данных и, в конечном итоге, вашу работу. контейнеры дают сбой и выбрасывают ошибки памяти.
Предложение: Вы можете сначала записать каждый присоединенный кадр данных в HDFS. Я хочу сказать, что после того, как вы объединили 2 (может быть больше 2, но ограничьте их) данных, запишите объединенный кадр данных в HDFS / Hive и используйте select * 'hive parquet table
val refinedDF1 = df1.join(df2 ,condition,'join_type')
refinedDF1.write.parquet("location") or refinedDF1.write.mode("overwrite").saveAsTable("dbname.refine1")
val refinedDF1 = hc.sql("select * from dbname.refine1")
val refinedDF2 = refinedDF1.join(df3)
refinedDF2.write.parquet("location") or refinedDF1.write.mode("overwrite").saveAsTable("dbname.refine2")
val refinedDF2 = hc.sql("select * from dbname.refine2")
Теперь вы часто записываете свои соединения в hdfs, это означает, что искра не должна будет выполнять их при вызове окончательного соединения, она будет использовать только вывод 52-го соединения что вы сохранили в виде таблицы.
С использованием этой методики мой сценарий сократился с 22 часов (включая ошибки памяти контейнера) до 15–30 (без исключения памяти / ошибок).
Несколько советов:
1) Исключите записи, в которых ваше объединение key
имеет значение null, spark не дает хорошей производительности по сравнению с объединениями, имеющими условие null = null
, поэтому удалите их перед объединением с фреймами данных
3) После выполнения скрипта вам придется очистить промежуточные кадры данных, которые вы сохраняете в Hive / Hdfs.
определение regex:
(?P<zip>...)
Создает именованную группу "zip"
Zip:\s*
Соответствие "Zip": и нуль или больше пробельных символов
\d
Соответствуйте цифре
\w
Соответствуйте словесному символу [A-Za-z0-9 _]
y.groupdict('zip')
groupdict метод возвращает словарь с именованными группами как ключи и их соответствия как значения. В этом случае соответствие для группы "zip" возвращается
y.group(2)
Возвратите соответствие для второй группы, которая является группой без имени" (...)"
Надежда, которая помогает.
Метод поиска возвратит объект, содержащий результаты Вашего regex шаблона.
groupdict возвращает словарь групп, где ключи являются именем групп, определенных (? P...). Здесь имя является именем группы.
группа возвращает список групп, которые подобраны. "Состояние: Нью-Йорк" является Вашей третьей группой. Первой является вся строка, и второй является "Zip: 10010".
Это было относительно простым вопросом между прочим. Я просто искал документацию метода относительно Google и нашел эту страницу. Google является Вашим другом.
# my_regex = r' <= this means that the string is a raw string, normally you'd need to use double backslashes
# ( ... ) this groups something
# ? this means that the previous bit was optional, why it's just after a group bracket I know not
# * this means "as many of as you can find"
# \s is whitespace
# \d is a digit, also works with [0-9]
# \w is an alphanumeric character
my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)'
addrs = "Zip: 10010 State: NY"
# Runs the grep on the string
y = re.search(my_regex, addrs)
Добавление к предыдущим ответам: По-моему, необходимо выбрать один тип групп (названный или без имени) и палка с ним. Обычно я использую названные группы. Например:
>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(?P<state>State:\s*\w\w)'
>>> addrs = "Zip: 10010 State: NY"
>>> y = re.search(my_regex, addrs)
>>> print y.groupdict()
{'state': 'State: NY', 'zip': 'Zip: 10010'}
(?P<identifier>match)
синтаксис является способом Python реализовать названный группами фиксации. Тем путем можно ли получить доступ к тому, чем был подобран match
использование имени вместо просто порядкового номера.
Так как первый набор круглых скобок называют zip
, можно получить доступ к его соответствию с помощью соответствия groupdict
метод для получения {identifier: match}
пара. Или Вы могли использовать y.group('zip')
если Вы только интересуетесь соответствием (который обычно имеет смысл, так как Вы уже знаете идентификатор). Вы могли также получить доступ к тому же соответствию с помощью его порядкового номера (1). Следующее соответствие без имени, таким образом, единственным способом получить доступ к нему является свое число.
strfriend является Вашим другом:
http://strfriend.com/vis?re= (Zip%3A\s*\d\d\d\d\d)\s* (State%3A\s*\w\w)
Править: Почему heck - это делающий всю строку ссылка в фактическом комментарии, но не предварительный просмотр?