开发者社区> 问答> 正文

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

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

我修改了这里使用的代码。

数据>>任何数字都被读作字符串。

代码>>

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

错误>>

: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)})

展开
收起
社区小助手 2018-12-05 15:16:49 4130 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    问题是,结果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))})

    2019-07-17 23:18:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spark Streaming At Bing Scale 立即下载
Apache Spark: Cloud and On-Prem 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载