我有一个架构,其所有列都为StringType
,我正在从这里创建一个dataFrame
val rdd = sc.textFile("s3://trfsmallfffile/FinancialSource/MAIN")
val header = rdd.filter(_.contains("Source.organizationId")).map(line => line.split("\\|\\^\\|")).first()
val schema = StructType(header.map(cols => StructField(cols.replace(".", "_"), StringType)).toSeq)
val data = sqlContext.createDataFrame(rdd.filter(!_.contains("Source.organizationId")).map(line => Row.fromSeq(line.split("\\|\\^\\|").toSeq)), schema)
现在我通过复制架构创建另一个dataFrame,但新架构中的数据类型发生了变化,我不知道为什么
如何保留数据相同的数据类型?
以下是我创建新dataFrame的方法
val temp = dfType.select(dfType.columns.filter(x => !x.equals("sr:Auditors")).map(x => col(x).as(x.replace("_", "Source_").replace("sr:", ""))): _*)
//temp.show(false)
val dataMain = df1resultFinal.withColumn("TimeStamp", lit(null: String))
val dfReorder = dataMain.columns.toSeq
val tempReorder=temp.select(dfReorder.map(c => col(c)): _*)
val diff = schema.fieldNames.diff(tempReorder.schema.fieldNames)
val finaldf = diff.foldLeft(tempReorder){(temp2df, colName) => temp2df.withColumn(colName, lit("null"))}
我可以转换每个列并使其成为相同的模式。但是,无论如何都要保留相同的数据类型而不进行转换?