Python-Regex, что продолжается здесь?

У меня было похожее состояние, когда у меня было несколько объединений, и в конце мне пришлось записать окончательный кадр данных в таблицу 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, поэтому удалите их перед объединением с фреймами данных

[ 1111] 2) Используйте широковещательные объединения, когда у вас осталось много строк, а правый - искомый или несколько строк.

3) После выполнения скрипта вам придется очистить промежуточные кадры данных, которые вы сохраняете в Hive / Hdfs.

6
задан Alan Moore 22 August 2009 в 12:56
поделиться

6 ответов

определение regex:

(?P<zip>...)

Создает именованную группу "zip"

Zip:\s*

Соответствие "Zip": и нуль или больше пробельных символов

\d

Соответствуйте цифре

\w

Соответствуйте словесному символу [A-Za-z0-9 _]

y.groupdict('zip')

groupdict метод возвращает словарь с именованными группами как ключи и их соответствия как значения. В этом случае соответствие для группы "zip" возвращается

y.group(2)

Возвратите соответствие для второй группы, которая является группой без имени" (...)"

Надежда, которая помогает.

8
ответ дан 9 December 2019 в 22:41
поделиться

Метод поиска возвратит объект, содержащий результаты Вашего regex шаблона.

groupdict возвращает словарь групп, где ключи являются именем групп, определенных (? P...). Здесь имя является именем группы.

группа возвращает список групп, которые подобраны. "Состояние: Нью-Йорк" является Вашей третьей группой. Первой является вся строка, и второй является "Zip: 10010".

Это было относительно простым вопросом между прочим. Я просто искал документацию метода относительно Google и нашел эту страницу. Google является Вашим другом.

2
ответ дан 9 December 2019 в 22:41
поделиться
# 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)
1
ответ дан 9 December 2019 в 22:41
поделиться

Добавление к предыдущим ответам: По-моему, необходимо выбрать один тип групп (названный или без имени) и палка с ним. Обычно я использую названные группы. Например:

>>> 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'}
0
ответ дан 9 December 2019 в 22:41
поделиться

(?P<identifier>match) синтаксис является способом Python реализовать названный группами фиксации. Тем путем можно ли получить доступ к тому, чем был подобран match использование имени вместо просто порядкового номера.

Так как первый набор круглых скобок называют zip, можно получить доступ к его соответствию с помощью соответствия groupdict метод для получения {identifier: match} пара. Или Вы могли использовать y.group('zip') если Вы только интересуетесь соответствием (который обычно имеет смысл, так как Вы уже знаете идентификатор). Вы могли также получить доступ к тому же соответствию с помощью его порядкового номера (1). Следующее соответствие без имени, таким образом, единственным способом получить доступ к нему является свое число.

0
ответ дан 9 December 2019 в 22:41
поделиться

strfriend является Вашим другом:

http://strfriend.com/vis?re= (Zip%3A\s*\d\d\d\d\d)\s* (State%3A\s*\w\w)

Править: Почему heck - это делающий всю строку ссылка в фактическом комментарии, но не предварительный просмотр?

0
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: