【发布时间】:2018-09-07 02:18:18
【问题描述】:
想象以下输入:
val data = Seq (("1::Alice"), ("2::Bob"))
val dfInput = data.toDF("input")
val dfTwoColTypeString = dfInput.map(row => row.getString(0).split("::")).map{ case Array(id, name) => (id, name) }.toDF("id", "name")
现在我有一个包含所需列的 DataFrame:
scala> dfTwoColTypeString.show
+---+-----+
| id| name|
+---+-----+
| 1|Alice|
| 2| Bob|
+---+-----+
我当然想要int类型的列id,但它是String类型的:
scala> dfTwoColTypeString.printSchema
root
|-- id: string (nullable = true)
|-- name: string (nullable = true)
因此我定义了这个架构:
val mySchema = StructType(Array(
StructField("id", IntegerType, true),
StructField("name", StringType, true)
))
将 DataFrame dfTwoColTypeString 转换或转换为给定目标架构的最佳方法是什么。
奖励:如果给定的输入无法转换或转换为目标模式,我希望得到一个空行,其中包含一个包含错误输入数据的额外列“bad_record”。也就是说,我想完成与 PERMISSIVE 模式下的 CSV 解析器相同的操作。
非常感谢任何帮助。
【问题讨论】:
-
我正在寻找的是与 CSV 阅读器一样聪明的东西。 IE。我没有解析 csv 文件或 Dataset[String],而是有一个 Dataset[List[String]],并且像 CSV 解析器一样,我希望有一个函数,它将 List[String] 转换为对应于类型的 List由目标架构给出,无需手动转换每一列。
标签: csv apache-spark apache-spark-sql