如何从pyspark dataframe的schema属性(从拼花文件)获取特定字段名的数据类型?

如何从pyspark dataframe的schema属性(从拼花文件)获取特定字段名的数据类型?,pyspark,Pyspark,有一个拼花文件的文件夹,我正在pyspark会话中阅读。如何检查/解析各个模式字段类型和其他信息(例如,为了比较数据帧之间的模式以查看确切的类型差异) 我可以看到拼花图案和特定的字段名,比如 从pyspark.sql导入SparkSession 从pyspark.sql.functions导入* sparkSession=sparkSession.builder.appName(“数据_调试”).getOrCreate() df=sparkSession.read.option(“标头”、“tr

有一个拼花文件的文件夹,我正在pyspark会话中阅读。如何检查/解析各个模式字段类型和其他信息(例如,为了比较数据帧之间的模式以查看确切的类型差异)

我可以看到拼花图案和特定的字段名,比如

从pyspark.sql导入SparkSession
从pyspark.sql.functions导入*
sparkSession=sparkSession.builder.appName(“数据_调试”).getOrCreate()
df=sparkSession.read.option(“标头”、“true”)。拼花地板(“hdfs://hw.co.local:8020/path/to/parquets")
df.schema#或df.printSchema()
df.fieldNames()
所以我可以看到模式

StructType(列表(StructField(某些字段\u 001,StringType,true)、StructField(某些字段\u 002,StringType,true)、StructField(某些字段\u 003,StringType,true)))
但不确定如何获取特定字段的值,例如

df.schema.getType(“SOME\u FIELD\u 001”)
或
getData(“SOME_FIELD_001”)#类型:dict
有人知道如何做这样的事情吗?

此函数在dict中收集(名称、类型、可空性),并使基于dataframe的列名查找信息变得容易。 如果将name指定为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
现在您可以比较不同dataframe的列信息。 例子: 方法1: 您可以使用
df.dtypes
方法获取字段名及其数据类型,并将其转换为
dict
对象,如下所示

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

print(myschema.get('some_field_002'))
现在,您可以获得如下所示的数据类型

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

print(myschema.get('some_field_002'))
输出:

'string'
StringType
方法2: 或者,如果您希望数据类型作为
pyspark.sql.types
对象,您可以使用
df.schema
方法并创建自定义模式字典,如下所示

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

print(myschema.get('some_field_002'))
输出:

'string'
StringType