非常慢的镶木地板读

时间:2018-04-13 16:27:57

标签: scala apache-spark parquet

我试图从两个不同的位置A和B读取镶木地板文件。它们都是GCP中的镶木地板文件,模式中的列数大致相同(80 - 90,主要是字符串)。 B的文件大小和记录数量非常小(比A小约5个数量级)。但是从GS读取大约需要大约相同的时间。我想知道为什么会这样。

scala> show_timing{spark.read.parquet("gs://bucket-name/tables/A/year=2018/month=4/day=5/*")}
Time elapsed: 34862525 microsecs
res5: org.apache.spark.sql.DataFrame = [a1: string, a2: string ...     84 more fields]

scala> show_timing{spark.read.parquet("gs://bucket-name/tables/B/year=2018/month=4/day=5/*")}
Time elapsed: 25094417 microsecs
res6: org.apache.spark.sql.DataFrame = [b1: string,     b2: string ... 81 more fields]

scala> res5.count()
res7: Long = 2404444736

scala> res6.count()
res8: Long = 98787

我的火花版是2.2。我知道这并不是很多信息。但我不太清楚还有什么可以调查的。

1 个答案:

答案 0 :(得分:2)

原因是当执行read.parquet操作时,spark实际上并不是读取数据,因此读取操作大致需要相同的时间。 read lazy ,也就是说,只有在您执行操作(例如count)时才会访问数据。我打赌两个计数操作不会同时进行!

执行read时,它只会读取镶木地板文件的元数据以确定架构,因此文件大小并不重要。

看一下spark中的变换与动作。有些操作会触发计算(以及因此实现rdd的I / O),有些操作不会:https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations