Создать фрейм данных, выбирая только те строки, которые соответствуют условию - PullRequest
0 голосов
/ 22 января 2019

У меня есть большая таблица в Hive (от десятков до сотен миллионов строк), из которой я хочу выбрать только те, которые соответствуют регулярному выражению.

В настоящее время у меня есть небольшой пример, чтобы сначала попробовать мой код:

columns = ['id', 'column']
vals = [
(1, "VAL_ID1 BD store"),
(2, "VAL_ID2 BD store"),
(3, "VAL_ID3 BD model"),
(4, "BAD WRONG")
]

df = spark.createDataFrame(vals, columns)

И затем я протестировал регулярное выражение, которое выглядит так:

df_regex = df.withColumn('newColumn',F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1))

Как я уже сказал, это тестовый фрейм данных.В будущем я заставлю его «посмотреть» на очень большой стол.Есть ли способ только добавить строки, которые соответствуют регулярному выражению, и таким образом создать намного меньший размер данных?

Как сейчас, я читаю каждую строку, а затем добавляю столбецwithColumn с пустым полем для строк, которые не соответствуют регулярному выражению.Это имеет смысл, но я чувствую, что есть смысл не читать этот фрейм два раза, если я могу его избежать.

1 Ответ

0 голосов
/ 22 января 2019

Вы хотите использовать where, вероятно.

df.where(
    F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1) != F.lit('')
)

На самом деле, я попробовал ваше регулярное выражение, и оно не дает результатов. Но пока вы понимаете принцип, я думаю, что вы можете использовать это решение.


EDIT:

Мне кажется, что нет смысла не читать этот фрейм два раза, если я могу избежать его.

Spark прочитает ваши данные, только если вы выполните «действие». Преобразования ленивы и поэтому оцениваются только в конце ... поэтому не нужно беспокоиться о том, что Spark прочитает ваши данные дважды (или больше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...