Apache spark Spark-从拼花地板读取列子集的不同方式将导致不同的输入和随机大小
有人能解释一下为什么用不同的方法从拼花地板上读取相同的列子集会导致不同的输入和洗牌大小(洗牌时) 举个例子,, 我有一个以拼花格式写入HDFS的数据集,带有模式(使用case类表示) 在使用数据时,我只需要字段的一个子集Apache spark Spark-从拼花地板读取列子集的不同方式将导致不同的输入和随机大小,apache-spark,parquet,Apache Spark,Parquet,有人能解释一下为什么用不同的方法从拼花地板上读取相同的列子集会导致不同的输入和洗牌大小(洗牌时) 举个例子,, 我有一个以拼花格式写入HDFS的数据集,带有模式(使用case类表示) 在使用数据时,我只需要字段的一个子集 case class NeededFields(col1: Int, col2: String) 我生成了如下的测试数据 (1 to 1000000).map(i => WholeCaseClass(i, i.toString, 2*i)).toDS.write.par
case class NeededFields(col1: Int, col2: String)
我生成了如下的测试数据
(1 to 1000000).map(i => WholeCaseClass(i, i.toString, 2*i)).toDS.write.parquet(path)
以下是读取列子集的不同方法:案例1<代码>spark.read.parquet(路径).as[NeededFields]
案例2<代码>spark.read.parquet(路径)。选择(“col1”、“col2”)。作为[所需字段]
案例3
spark.read.parquet(path).as[WholeCaseClass].map(x=>needfields(x.col1,x.col2))
案例4<代码>spark.read.parquet(path).as[needfields].map(identity) 为了便于比较,我还添加了读取整个CaseClass的案例
案例5<代码>spark.read.parquet(路径).as[WholeCaseClass]
对于它们中的每一个,我都执行一个.distinct.count
来强制执行洗牌并触发操作
以下是每个案例的输入和随机播放大小:
案例1:
spark.read.parquet(path).as[needfields].distinct.count
输入大小:12.3 MB,随机写入:63.1 MB 案例2:
spark.read.parquet(path)。选择(“col1”、“col2”).as[needfields]。distinct.count
输入大小:8.4 MB,随机写入:58.2 MB 案例3:
spark.read.parquet(path).as[WholeCaseClass].map(x=>needfields(x.col1,x.col2)).distinct.count
输入大小:12.3 MB,随机写入:58.2 MB 案例4:
spark.read.parquet(path).as[needfields].map(identity).distinct.count
输入大小:8.4 MB,随机写入:58.2 MB 案例5:
spark.read.parquet(path).as[WholeCaseClass].distinct.count
输入大小:12.3 MB,随机写入:63.1 MB 如结果所示:
案例1和案例5的输入量和洗牌大小相同
案例2和案例4的输入和洗牌大小最小
案例3的输入大小与案例1和5相同,但洗牌大小更小(与案例2和4相同) 问题:
.as[NeededFields]
没有告诉spark这些是唯一需要的字段.as[needfields]
之后执行.map(identity)
2.4.4
(并且在spark2.1.0
上具有相同的行为)
(1 to 1000000).map(i => WholeCaseClass(i, i.toString, 2*i)).toDS.write.parquet(path)