import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.type.NumericType
import org.apache.spark.sql.type.BooleanType
....
....
val TableSchema = Array(
("ID", IntegerType),
("Name", StringType),
("TNum", integerType),
("Handled", BooleanType),
("Value", StringType)
)
我有一个表的架构信息数组,我试图将它映射到可以在spark数据帧创建中使用的结构。转换后的数组应如下所示:
val struct = Array(
StructField("ID", NumericType),
StructField("Name", BooleanType),
StructField("TNum", NumericType),
StructField("Handled", BooleanType),
StructField("Value", StringType))
所以我试图编写一个将每个元素转换为StructField的方法。这是我的尝试:
def mapToStruct(arr:Array[(String, String, Object)])={
val newArr = arr.map(ele => StructField(ele._1, ele._2))
newArr
}
在这种情况下,我无法从方法mapToStruct的第三个参数中获取StringType
,BooleanType
或IntegerType
的类。我得到的例外是type mismatch; found : Object required: org.apache.spark.sql.types.DataType
。但是如果我将参数类型更改为Array [(String,String,DataType)],则它与变量类型不匹配。
我的问题是我应该为方法mapToStruct的第三个参数选择什么数据类型,然后我可以在运行时获取该对象的类。
提前谢谢。
答案 0 :(得分:1)
这应该有效:
import org.apache.spark.sql.types.
val tableSchema: Array[(String, DataType)] = Array(
("ID", IntegerType),
("Name", StringType),
("Handled", BooleanType),
("Value", StringType)
)
def mapToStruct(arr: Array[(String, DataType)]): Array[StructField] = arr.map(e => StructField(e._1, e._2))