>我有一个rdd,它的类型都是字符串,因为它是从文本文件中读取的,大约有20个字段。例如
val rdd = sc.parallelize(Seq( ("1", "2.0", "three"), ("1", "2.0", "three")))
我想使用动态生成的结构类型来创建数据帧,例如 -
val aStruct = new StructType(Array(StructField("id",LongType,nullable = true),StructField("id2",StringType,nullable = true), StructField("role",StringType,nullable = true)))
val df = sqlContext.createDataFrame(rdd, aStruct)
有没有办法自动处理它,或者我需要在创建数据帧之前使用正确的类型更新rdd上的每个字段。
如果您自己创建了 StructType 并将其用于数据帧,则无法自动处理它。我猜您想对多个数据源使用相同的代码逻辑。
1)如果您的数据来自文件并且是csv类型或任何分隔数据,我建议您尝试spark-csv有一个名为InferSchema的选项,它会自动识别数据,无需手动创建架构。
但是,如果您需要使用 RDD,有两种方法:1) 创建案例类 2) 创建 StuckType,就像您基于数据动态创建的那样。对于他们两个,我认为你不会得到你所期望的。
如果您无法使用Spark-CSV,请提供有关该问题的更多详细信息,我可以尝试提供解决方案。
我在循环中使用了数据帧上的以下 API 来更新列。
def withColumn(colName: String, col: Column): DataFrame