Написать спарк-фрейм с несколькими столбцами структуры и несколькими столбцами типа int / string? - PullRequest
0 голосов
/ 27 марта 2020

Например, рассмотрим приведенный ниже фрейм данных:

enter image description here

Я хочу записать это в Postgres, и в конечной таблице должны быть все столбцы, а не строковый колонка. Я не могу взорвать несколько массивов на этом уровне (бизнес логики c).

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Оказалось довольно простым решением использовать to_ json для преобразования [[StructType]] в строку JSON, поддерживаемую в Postgres.

for c in df.columns: if c is in ["arrCol1", "arrCol2", "arrCol3"]: df = df.withColumn(c, to_json(c))* 1004. *

Это преобразовало бы массив структур в строковый тип.

0 голосов
/ 28 марта 2020

Если я правильно понимаю вашу проблему, вы хотите обработать структурные поля как их собственные таблицы:

from pyspark.sql.functions import explode

def get_struct_dfs(df):
  result_dfs = []
  for column in df.columns:
     if isinstance(df.schema[column].dataType, (ArrayType, )):
          exploded_df = df.select(explode(column))
          result_dfs.extend(process(exploded_df))
     elif isinstance(df.schema[column].dataType, (StructType, )):
          exploded_df = df.select(f"{column}.*")
          result_dfs.append(exploded_df)
  return result_dfs
...