简体   繁体   English

在另一个 df 的架构定义中使用 df 的架构?

[英]Use the schema of a df in a schema definition for another df?

I have a spark df with a schema like this:我有一个带有这样架构的 spark df:

print(df.schema)

StructType(List(StructField(column_info,ArrayType(StructType(List(StructField(column_datatype,StringType,true),StructField(column_description,StringType,true),StructField(column_length,StringType,true),StructField(column_name,StringType,true),StructField(column_personally_identifiable_information,StringType,true),StructField(column_precision,StringType,true),StructField(column_primary_key,StringType,true),StructField(column_scale,StringType,true),StructField(column_security_classifications,ArrayType(StringType,true),true),StructField(column_sequence_number,StringType,true))),true),true),StructField(file_code_page,StringType,true),StructField(file_delimiter,StringType,true),StructField(file_description,StringType,true),StructField(file_end_of_line_char,StringType,true),StructField(file_extension,StringType,true),StructField(file_footer_rows,StringType,true),StructField(file_header_rows,StringType,true),StructField(file_name,StringType,true),StructField(logs_id,StringType,true),StructField(metadata_version,StringType,true),StructField(oar_id,StringType,true),StructField(schema_version,StringType,true)))

I want to use this schema in another df.我想在另一个 df 中使用这个模式。 To do so, I adjust manually to have this format:为此,我手动调整以具有以下格式:

mdata_schema = StructType([\
                                  StructField('column_info',ArrayType(StructType([\
                                                                                    StructField('column_datatype',StringType(),True),\
                                                                                    StructField('column_description',StringType(),True),\
                                                                                    StructField('column_length',StringType(),True),\
                                                                                    StructField('column_name',StringType(),True),\
                                                                                    StructField('column_personally_identifiable_information',StringType(),True),\
                                                                                    StructField('column_precision',StringType(),True),\
                                                                                    StructField('column_primary_key',StringType(),True),\
                                                                                    StructField('column_scale',StringType(),True),\
                                                                                    StructField('column_security_classifications',ArrayType(StringType(),True),True),\
                                                                                    StructField('column_sequence_number',StringType(),True)]),True),True),\
                                  StructField('file_code_page',StringType(),True),\
                                  StructField('file_delimiter',StringType(),True),\
                                  StructField('file_description',StringType(),True),\
                                  StructField('file_end_of_line_char',StringType(),True),\
                                  StructField('file_extension',StringType(),True),\
                                  StructField('file_footer_rows',StringType(),True),\
                                  StructField('file_header_rows',StringType(),True),\
                                  StructField('file_name',StringType(),True),\
                                  StructField('logs_id',StringType(),True),\
                                  StructField('metadata_version',StringType(),True),\
                                  StructField('oar_id',StringType(),True),\
                                  StructField('schema_version',StringType(),True)\
                             ])

Is there a way to avoid this manual adjustment?有没有办法避免这种手动调整? Is there a build in method that I can extract the schema so I can use it automaticallin another df?是否有一种内置方法可以提取模式,以便我可以在另一个 df 中自动使用它?

As others said if you have that dataframe accessible in your notebook then you can read the df.schema.fields in a structype and use that as schema, else you can use the below function to generate string for first data frame and use output string as schema for second dataframe正如其他人所说,如果您可以在笔记本中访问该数据框,那么您可以读取结构类型中的 df.schema.fields 并将其用作架构,否则您可以使用以下函数为第一个数据框生成字符串并将输出字符串用作第二个数据框的架构

k=[]
for f in df.schema.fields:
  x=StructField('"'+f.name+'"',f.dataType,f.nullable)
  k.append(x)
print("StructType("+str(k).replace(",true","(),True").replace(",false","(),False")+")")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM