有人能解释一下为什么用不同的方法从Parquet地板中读取相同的列子集会导致不同的输入和无序大小(无序时)?
举一个例子,我将一个数据集以parquet格式和schema(用case类表示)写入hdfs
case class WholeCaseClass(col1: Int, col2: String, col3: Int)
在使用数据时,我只需要字段的一个子集
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(path).as[NeededFields]
案例2。 spark.read.parquet(path).select("col1", "col2").as[NeededFields]
案例3。 spark.read.parquet(path).as[WholeCaseClass].map(x => NeededFields(x.col1, x.col2))
案例4。 spark.read.parquet(path).as[NeededFields].map(identity)
我还添加了阅读 WholeCaseClass
只是为了比较
案例5。 spark.read.parquet(path).as[WholeCaseClass]
对于他们每个人,我都做了一个 .distinct.count
强制洗牌并触发动作。
以下是每个案例的输入和随机大小:
案例1: spark.read.parquet(path).as[NeededFields].distinct.count
案例1
输入大小:12.3 mb,随机写入:63.1 mb
案例2: spark.read.parquet(path).select("col1", "col2").as[NeededFields].distinct.count
案例2
输入大小:8.4 mb,随机写入:58.2 mb
案例3: spark.read.parquet(path).as[WholeCaseClass].map(x => NeededFields(x.col1, x.col2)).distinct.count
案例3
输入大小:12.3 mb,随机写入:58.2 mb
案例4: spark.read.parquet(path).as[NeededFields].map(identity).distinct.count
案例4
输入大小:8.4 mb,随机写入:58.2 mb
案例5: spark.read.parquet(path).as[WholeCaseClass].distinct.count
案例5
输入大小:12.3 mb,随机写入:63.1 mb
结果显示:
案例1和案例5的输入量和洗牌大小相同
案例2和案例4的结果是最小的输入和洗牌大小
案例3的输入大小与案例1和5相同,但洗牌大小较小(与案例2和4相同)
问题:
为什么案例1和案例5有相同的输入和洗牌,好像 .as[NeededFields]
不会告诉spark这些是唯一需要的领域。
为什么案例4的输入大小和洗牌大小都比案例1小,而它所做的只是做一个简单的操作 .map(identity)
之后 .as[NeededFields]
我使用的spark版本是 2.4.4
(在Spark上有相同的行为 2.1.0
)
暂无答案!
目前还没有任何答案,快来回答吧!