拆分数据数据类型后的Spark RDD如何在不更改数据类型的情况下拆分

Posted

技术标签:

【中文标题】拆分数据数据类型后的Spark RDD如何在不更改数据类型的情况下拆分【英文标题】:Spark RDD after splitting of data data type is changed how can i split without changing data type 【发布时间】:2020-10-22 07:38:50 【问题描述】:

在拆分数据数据类型更改后,我已将数据从文本文件加载到 Spark RDD。如何在不更改数据类型的情况下进行拆分,或者如何将拆分后的数据转换为原始数据类型?

我的代码

from pyspark import SparkConf, SparkContext 
conf = SparkConf().setMaster("local").setAppName("Movie") 
sc = SparkContext(conf = conf) 
movies = sc.textFile("file:///SaprkCourse/movie/movies.txt")
data=movies.map(lambda x: x.split(","))
data.collect()

我的意见是这样的

userId,movieId,rating,timestamp
1,1,4.0,964982703
1,3,4.0,964981247
1,6,4.0,964982224
1,47,5.0,964983815
1,50,5.0,964982931

拆分后我的完整数据改为String类型

我要求输出与输入文本文件中的数据类型相同,如IntegerType, IntegerType, IntegerType, IntegerType

【问题讨论】:

【参考方案1】:

读取文本文件时的火花会影响所有列的 StringType 类型,因此如果要将列视为 IntegerType,则需要强制转换它们。

【讨论】:

【参考方案2】:

你的数据是 csv, 您应该使用 sparkSession,使用 csv 读取数据并定义您的架构。

scala 代码:

val schema = new Structype()
.add("userId",IntegerType)
.add("movieId",IntegerType)
.add("rating",IntegerType)
.add("timestamp",TimestampType)


spark.read.schema(schema).csv("file:///SaprkCourse/movie/movies.txt")

如果您想将文件作为文本继续阅读,您可以转换每一列:

斯卡拉:

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.IntegerType,TimestampType

   val df = data
    .select(
    col("userId").cast(IntegerType),
    col("movieId").cast(IntegerType),
    col("rating").cast(IntegerType),
    col("timestamp").cast(TimestampType)
    )

【讨论】:

嗨,我的输入文件是文本文件,但不是 CSV CSV 文件是文本,这个答案的重点是输入文本文件中的数据被组织为 CSV

以上是关于拆分数据数据类型后的Spark RDD如何在不更改数据类型的情况下拆分的主要内容,如果未能解决你的问题,请参考以下文章

spark RDD(弹性分布式数据集)可以更新吗?

Spark RDD操作记录(总结)

如何在不产生 .rdd 成本的情况下检查 Spark DataFrame 的分区数

spark的RDDAPI总结

Spark RDD理解

将数据框中的结构类型列拆分为多列