PySpark: выбор с префиксами / суффиксами - PullRequest
1 голос
/ 15 апреля 2020

В настоящее время я работаю с фреймом данных 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. Как мне искать во вложенном порядке?

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете сгладить столбцы структуры, используя df.selectExpr("allProperties.*","topic"..etc) (или) другим dynamici c способом.

  • Тогда мы можем createTempView для кадра данных выбрать регулярное выражение соответствующие столбцы из временного представления.

Example:

#sample dataframe after flattening
df=spark.createDataFrame([("a","1","b","c")],["allProperties.text","allProperties.quoted_status.text","allProperties.quoted_status.text","sample"])

df.show()
#+------------------+--------------------------------+--------------------------------+------+
#|allProperties.text|allProperties.quoted_status.text|allProperties.quoted_status.text|sample|
#+------------------+--------------------------------+--------------------------------+------+
#|                 a|                               1|                               b|     c|
#+------------------+--------------------------------+--------------------------------+------+

df.createOrReplaceTempView("tmp")

spark.sql("SET spark.sql.parser.quotedRegexColumnNames=true").show()

#(allProperties(..*|).text) regex match allProperties. or allProperties..*.text

spark.sql("select `(allProperties(..*|).text)` from tmp").show()
#+------------------+--------------------------------+--------------------------------+
#|allProperties.text|allProperties.quoted_status.text|allProperties.quoted_status.text|
#+------------------+--------------------------------+--------------------------------+
#|                 a|                               1|                               b|
#+------------------+--------------------------------+--------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...