Как получить тип данных для указанного c имени поля из атрибута схемы pyspark dataframe (из файлов паркета)? - PullRequest
1 голос
/ 04 февраля 2020

Есть папка с паркетными файлами, которые я читаю в сеансе pyspark. Как я могу проверить / проанализировать отдельные типы полей схемы и другую информацию (например, с целью сравнения схем между фреймами данных, чтобы увидеть точные различия типов)?

Я могу видеть схему паркета и указать c поле имена с чем-то вроде ...

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
sparkSession = SparkSession.builder.appName("data_debugging").getOrCreate()

df = sparkSession.read.option("header", "true").parquet("hdfs://hw.co.local:8020/path/to/parquets")
df.schema # or df.printSchema()
df.fieldNames()

Таким образом, я могу видеть схему

StructType(List(StructField(SOME_FIELD_001,StringType,true),StructField(SOME_FIELD_002,StringType,true),StructField(SOME_FIELD_003,StringType,true)))

, но не уверен, как получить значения для указанных c полей, например. что-то вроде ...

df.schema.getType("SOME_FIELD_001")
or
df.schema.getData("SOME_FIELD_001")  #type: dict

Кто-нибудь знает, как сделать что-то подобное?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Эта функция собирает (имя, тип, обнуляемость) в dict и упрощает поиск информации на основе имени столбца dataframe.

Если имя указано как df, будет вызван dict метаданных df.meta

name=df #enter name of dataframe here
def metadata(name): #function for getting metadata in a dict
  null=[str(n.nullable) for n in name.schema.fields] #nullability
  types=[str(i.dataType) for i in name.schema.fields] #type 
  both = [list(a) for a in zip(types, null)]#combine type+nullability
  names= name.columns #names of columns
  final = {} #create dict
  for key in names: 
     for value in both: 
          final[key] = value
          both.remove(value)
          break
  return final
name.meta= metadata(name) #  final dict is called df.meta
                          # if name=df2, final dict will be df2.meta

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

пример:

Input: df.meta
Output: {'col1': ['StringType', 'True'],
         'col2': ['StringType', 'True'],
         'col3': ['LongType', 'True'],
         'col4': ['StringType', 'True']}

#get column info
Input: df.meta['col1']
Output: ['StringType', 'True']

#compare column type + nullability
Input: df.meta['col1'] == df2.meta['col1']
Ouput: True/False


#compare only column type
Input: df.meta['col1'][0] == df2.meta['col1'][0]
Output: True/False

#compare only nullability
Input: df.meta['col1'][1] == df2.meta['col1'][1]
Output: True/False
0 голосов
/ 04 февраля 2020

Метод 1:

Вы можете использовать метод df.dtypes, чтобы получить имя поля вместе с его типом данных, и то же самое можно преобразовать в объект dict, как показано ниже,

myschema = dict(df.dtypes)

Теперь вы можете получить типы данных, как показано ниже:

myschema.get('some_field_002')

Вывод:

'string'

Метод 2:

В качестве альтернативы, если вы хотите типы данных в качестве объекта pyspark.sql.types, вы можете использовать метод df.schema и создать собственный словарь схемы, как показано ниже:

myschema = dict(map(lambda x: (x.name, x.dataType), df.schema.fields))

print(myschema.get('some_field_002'))

Вывод:

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