scala - Spark 3.0 读取 json 文件比 Spark 2.4 慢得多

标签 scala apache-spark java-11 spark3

我有大量的 json 文件,Spark 可以在 36 秒内读取这些文件,但 Spark 3.0 需要将近 33 分钟才能读取相同的文件。仔分割析,看起来 Spark 3.0 选择的 DAG 与 Spark 2.0 不同。有谁知道发生了什么? Spark 3.0.0 是否有任何配置问题?
Spark 2.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
Spark 3.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
详情如下:
enter image description here

最佳答案

事实证明 Spark 3.0 的默认行为已经改变 - 它试图推断时间戳 除非指定了架构,否则会导致大量的文本扫描。我尝试使用 inferTimestamp=false 加载数据,时间确实接近 Spark 2.4 的时间,但 Spark 2.4 仍然比 Spark 3 高约 3+ 秒(可能在可接受的范围内,但问题是为什么?)。我不知道为什么这种行为会改变,但应该用粗体字母通知。
Spark 2.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
Spark 3.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 到 true
    inferTimestamp 是错误的,它再次需要大量的时间。
  • Spark 3.0 + JDK 11 比 Spark 3.0 + JDK 8 慢了将近 6 秒。
  • 关于scala - Spark 3.0 读取 json 文件比 Spark 2.4 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62616739/

    相关文章:

    function - "Side-effecting lexical closure"vs Scala 中的函数

    scala - Scala 中的同步 HTTP 调用

    scala - Spark 2.0 Scala-RDD.toDF()

    python - 从 RDD 中的单词过滤 Spark 数据框中的行

    java - 如何在 Java 11 中使用不受支持的 Locale 和 String.format() 中的数字

    java - 线程中的异常 "main"java.lang.NoSuchMethodError : java. nio.ByteBuffer.flip()Ljava/nio/ByteBuffer

    scala - scala : mystified by warning 中的模式匹配零参数函数

    java - 如何将 Spark 数据帧输出转换为 json?

    scala - 显式转换读取 .csv 与案例类 Spark 2.1.0

    java - 如何在单击时更改按钮背景