В настоящее время я работаю с фреймом данных Spark (используя PySpark), представляющим большую коллекцию твитов, в которой у меня есть следующая (обрезанная) схема:
root
|-- allProperties: struct (nullable = true)
| |-- content: string (nullable = true)
| |-- contributors: string (nullable = true)
| |-- coordinates.coordinates: string (nullable = true)
| ...
| |-- quoted_status.contributors: string (nullable = true)
| |-- quoted_status.coordinates: string (nullable = true)
| |-- quoted_status.coordinates.coordinates: string (nullable = true)
| ...
| |-- retweeted_status.contributors: string (nullable = true)
| |-- retweeted_status.coordinates: string (nullable = true)
| |-- retweeted_status.coordinates.coordinates: string (nullable = true)
| ...
|-- datasetid: string (nullable = true)
|-- routingkey: string (nullable = true)
|-- topic: string (nullable = true)
Я хочу создать новый фрейм данных с помощью selecingt количество столбцов из исходного кадра данных. Например, allProperties.text
и allProperties.entities.hashtags
. Однако я также хочу выбрать те же твиты, которые являются ретвитами или цитируемыми твитами, обозначаемыми префиксом allProperties.retweeted_status
или allProperties.quoted_status
соответственно.
Есть ли способ, которым я могу выбрать все эти столбцы, не имея количество избыточных строк, в которых я указываю каждый из столбцов с их префиксами? Например, предоставляя какое-то регулярное выражение, которое ищет allProperties.text
, allProperties.retweeted_status.text
, allProperties.quoted_status.text
?
В качестве дополнительного примечания, я должен сказать, что хочу сохранить фрейм данных на верхнем уровне поскольку я также хочу включить topic
в новый фрейм данных.
До сих пор мне удалось написать регулярное выражение, соответствующее требуемым столбцам:
def _keep_columns(self):
def _regex_filter(x):
tweet_features = [
'text',
'entities.hashtags',
'entities.media',
'entities.urls',
]
r = (('(^allProperties.(retweeted_status.|quoted_status.)'
'?('+"|".join(tweet_features)+')$)'
'|(^topic$)'))
return bool(re.match(r, x))
df = self.tweets.select(*filter(lambda x: _regex_filter(x), self.tweets.columns))
Однако self.tweets.columns
возвращает только столбцы верхнего уровня и поэтому не может найти вложенные столбцы в allProperties
. Как мне искать во вложенном порядке?