Входные данные
import pandas as pd
import numpy as np
a1=["data.country", "data.studentinfo.city","data.studentinfo.name.id.grant"]
a2=["StringType()","StringType()","StringType()"]
d1=pd.DataFrame(list(zip(a1,a2)),columns=['action','type'])
мы должны построить структуру ниже, используя фреймворк данных, используя цикл for
StructType([StructField("data",
StructType([StructField("country",StringType(),True),
StructField("studentinfo",
StructType([StructField("city",StringType(),True),
StructField("name",StructType([
StructField("id",StructType([
StructField("grant",StringType(),True)])
)]))
])
)])
)])
На первом этапе создается структура, затем функция преобразует ее в формат:
s = dict()
for _, r in d1.iterrows():
d = s
fields = r['action'].split('.')
for name in fields[:-1]:
if not name in d:
d[name] = dict()
d = d[name]
d[fields[-1]] = r['type']
def sprint(n):
children = list()
for k, v in n.items():
entry = f'StructField("{k}",'
if type(v) is dict:
entry += sprint(v)
else:
entry += f'{v},True)'
children.append(entry)
return f'StructType([{",".join(children)}])'
print(sprint(s))