[英]How to create an DataFrame with a userdefine schema in Spark
我想在 Python 中使用指定的模式在 DataFrame 上創建。 這是我到目前為止所做的過程。
我有 Sample.parm 文件,我在其中定義了如下架構:Account_type,string,True
我已經編寫了 python 腳本 sample.py 來讀取 sample.parm 文件,根據 sample.parm 文件生成模式,然后根據用戶定義的模式生成數據幀。
d
def schema():
with open('<path>/sample.parm','r') as parm_file:
reader=csv.reader(parm_file,delimiter=",")
filteredSchema = []
for fieldName in reader:
if fieldName[1].lower() == "decimal":
filteredSchema.append([fieldName[0], DecimalType(),fieldName[2]])
elif fieldName[1].lower() == "string":
filteredSchema.append([fieldName[0], StringType(),fieldName[2]])
elif fieldName[1].lower() == "integer":
filteredSchema.append([fieldName[0], IntegerType(),fieldName[2]])
elif fieldName[1].lower() == "date":
filteredSchema.append([fieldName[0], DateType(),fieldName[2]])
elif fieldName[1].lower() == "byte":
filteredSchema.append([fieldName[0], ByteType(),fieldName[2]])
elif fieldName[1].lower() == "boolean":
filteredSchema.append([fieldName[0], BooleanType(),fieldName[2]])
elif fieldName[1].lower() == "short":
filteredSchema.append([fieldName[0], ShortType(),fieldName[2]])
elif fieldName[1].lower() == "long":
filteredSchema.append([fieldName[0], LongType(),fieldName[2]])
elif fieldName[1].lower() == "double":
filteredSchema.append([fieldName[0], DoubleType(),fieldName[2]])
elif fieldName[1].lower() == "float":
filteredSchema.append([fieldName[0], FloatType(),fieldName[2]])
elif fieldName[1].lower() == "timestamp":
filteredSchema.append([fieldName[0], TimestampType(),fieldName[2]])
struct_schema = [StructField(line[0], line[1], line[2]) for line in filteredSchema]
schema=StructTpe(struct_schema)
return schema
def create_dataframe(path):
val=spark.read.schema(schema()).csv(path, sep='\t')
print(val.take(1))
但得到如下錯誤: pyspark.sql.utils.IllegalArgumentException: u'Failed to convert the JSON string \\'{"metadata":{},"name":"account_type","nullable":"True","type":"string"}\\' to a field.'
你能請任何人幫我弄清楚嗎? 感謝你的幫助
我認為 JSON 構建不正確-元數據為空,缺少“類型”和“字段”。 請為您的架構嘗試以下 JSON。
{"type":"struct","fields":[{"name":"account_type","type":"string","nullable":true,"metadata":{"name":"account_type","scale":0}}]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.