Как вывести типы данных существующего Spark Dataframe? - PullRequest
0 голосов
/ 14 февраля 2020

Я перевернул длинный фрейм данных на широкий. Этот новый информационный фрейм имеет много новых переменных, выходящих из стержня. Это все stringType в кадре данных Spark. Как я могу заставить pyspark заново вывести типы данных этих новых столбцов, чтобы десятичные числа распознавались как float / double вместо строк?

Справочная информация: количество этих новых столбцов в таблице и число развернутых таблицы слишком велики, чтобы создавать схемы вручную.

Было бы неплохо, если есть что-то похожее на infer_objects() из Pandas, но внутри PySpark. Я не могу использовать Pandas, потому что работа находится в AWS Glue Spark, которая не предлагает библиотеки Pandas.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Хорошо, вот оно. По состоянию на февраль 2020 года в PySpark нет решения этой проблемы, кроме использования infer_objects() формы Pandas. Если вы не можете использовать Pandas, потому что вы используете клей AWS, тогда вам повезло и вам не повезло. Не повезло - потому что Pandas недоступен; повезло - потому что есть что-то еще лучше: recomputeSchema() в Scala.

Все, что вам нужно сделать, это

  1. Начните с DynamicFrame dyf
  2. Переместите dyf в Java с помощью dyf._jdf
  3. Используйте метод recomputeSchema() в Scala dyf._jdf.recomputeSchema(), который возвращает схему.
  4. Получите схему с помощью toString() метод и _deserialize_json_string( ) функция

Код будет

    from awsglue.gluetypes import _deserialize_json_string
    newSchema=_deserialize_json_string( dyf._jdf.recomputeSchema().toString() ) )

Тогда вы сможете приступить к решению выбора, как упомянул Серкан.

0 голосов
/ 19 февраля 2020

Вы можете использовать ResolveChoice Class для решения вашей проблемы. Вы можете выбрать один из типов действий, перечисленных в документации.

cast: Позволяет указать тип для приведения (например, cast: int).

make_cols : Устраняет потенциальную неоднозначность путем выравнивания данных. Например, если columnA может быть int или строкой, разрешение заключается в создании двух столбцов с именами columnA_int и columnA_string в результирующем DynamicFrame.

make_struct: устраняет потенциальную неоднозначность, используя структуру для представления данных. Например, если данные в столбце могут быть int или строкой, использование действия make_struct создает столбец структур в результирующем DynamicFrame, каждый из которых содержит как int, так и строку.

project: разрешает потенциал двусмысленность, сохраняя только значения указанного типа в результирующем DynamicFrame. Например, если данные в столбце ChoiceType могут быть целыми числами или строками, при указании проекта: строковое действие удаляет столбцы из результирующего динамического кадра, которые не являются типом строки.

Для проверки всех возможных типов сначала , вы можете использовать make_struct тип действия, затем вы можете использовать cast action или вы можете использовать make_cols тип действия и склеивать все возможные типы как новые столбцы.

Я собираюсь поделиться примером блока кода ниже.

resolvechoiceA = ResolveChoice.apply(frame = datasourceA, choice = "make_cols", transformation_ctx = "resolvechoiceA")

Я надеюсь, что этот ответ может решить вашу проблему.

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