我正在以编程方式尝试转换列的数据类型并遇到一些编码问题。
为此,我修改了here使用的代码。
数据>>将任何数字读取为字符串。
代码>>
import org.apache.spark.sql
raw_data.schema.fields
.collect({case x if x.dataType.typeName == "string" => x.name})
.foldLeft(raw_data)({case(dframe,field) => dframe(field).cast(sql.types.IntegerType)})
错误>>
<console>:75: error: type mismatch;
found : org.apache.spark.sql.Column
required: org.apache.spark.sql.DataFrame
(which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
.foldLeft(raw_data)({case(dframe,field) => dframe(field).cast(sql.types.IntegerType)})
答案 0 :(得分:2)
问题是dframe(field).cast(sql.types.IntegerType)
中foldLeft
的结果是一列,但是,要继续迭代,需要一个数据帧。在代码最初来自dframe.drop(field)
的链接中,该链接确实会返回数据帧,因此可以正常工作。
要解决此问题,只需使用withColumn
即可调整特定列,然后返回整个数据帧:
foldLeft(raw_data)({case(dframe, field) => dframe.withColumn(field, dframe(field).cast(sql.types.IntegerType))})