在Scala Spark中以编程方式将所有特定的数据类型列转换为其他数据类型

时间:2018-11-27 05:29:42

标签: scala apache-spark apache-spark-sql

我正在以编程方式尝试转换列的数据类型并遇到一些编码问题。

为此,我修改了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)})

1 个答案:

答案 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))})