Spark3.0读取json文件的速度比Spark2.4慢得多

cgh8pdjw  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(989)

我有大量的json文件,spark可以在36秒内读取,但是spark3.0几乎需要33分钟才能读取。仔细分析,看起来spark 3.0选择的dag与spark 2.0不同。有人知道发生了什么事吗?spark 3.0是否存在任何配置问题。
Spark2.4

scala> spark.time(spark.read.json("/data/20200528"))
Time taken: 19691 ms
res61: org.apache.spark.sql.DataFrame = [created: bigint, id: string ... 5 more fields]

scala> spark.time(res61.count())
Time taken: 7113 ms
res64: Long = 2605349

Spark3.0

scala> spark.time(spark.read.json("/data/20200528"))
20/06/29 08:06:53 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.
Time taken: 849652 ms
res0: org.apache.spark.sql.DataFrame = [created: bigint, id: string ... 5 more fields]

scala> spark.time(res0.count())
Time taken: 8201 ms
res2: Long = 2605349

详情如下:

c0vxltue

c0vxltue1#

结果表明,spark 3.0的默认行为已经发生了变化——它试图推断时间戳,除非指定了模式,这将导致大量的文本扫描。我试着用infertimestamp=false加载数据,虽然时间确实接近spark2.4,但spark2.4仍然比spark3快了3秒(可能在可接受的范围内,但问题是为什么?)。我不知道为什么这个行为被改变了,但是应该用粗体字通知它。
Spark2.4

spark.time(spark.read.option("inferTimestamp","false").json("/data/20200528/").count)
Time taken: 29706 ms
res0: Long = 2605349

spark.time(spark.read.option("inferTimestamp","false").option("prefersDecimal","false").json("/data/20200528/").count)
Time taken: 31431 ms
res0: Long = 2605349

Spark3.0

spark.time(spark.read.option("inferTimestamp","false").json("/data/20200528/").count)
Time taken: 32826 ms
res0: Long = 2605349

spark.time(spark.read.option("inferTimestamp","false").option("prefersDecimal","false").json("/data/20200528/").count)
Time taken: 34011 ms
res0: Long = 2605349

注:
确保永远不要启用prefersdecimal to true,即使infertimestamp为false,也需要大量时间。
spark 3.0+jdk 11比spark 3.0+jdk 8慢近6秒。

相关问题