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