Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark-从拼花地板读取列子集的不同方式将导致不同的输入和随机大小_Apache Spark_Parquet - Fatal编程技术网

Apache spark Spark-从拼花地板读取列子集的不同方式将导致不同的输入和随机大小

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

有人能解释一下为什么用不同的方法从拼花地板上读取相同的列子集会导致不同的输入和洗牌大小(洗牌时)

举个例子,, 我有一个以拼花格式写入HDFS的数据集,带有模式(使用case类表示)

在使用数据时,我只需要字段的一个子集

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相同)

问题:

  • 为什么案例1和案例5具有相同的输入和无序排列,好像
    .as[NeededFields]
    没有告诉spark这些是唯一需要的字段
  • 为什么案例4的输入大小和洗牌大小比案例1小,而它所做的只是在
    .as[needfields]
    之后执行
    .map(identity)
  • 我使用的spark版本是
    2.4.4
    (并且在spark
    2.1.0
    上具有相同的行为)

    (1 to 1000000).map(i => WholeCaseClass(i, i.toString, 2*i)).toDS.write.parquet(path)