load()在spark中有什么作用?

时间:2019-06-29 15:14:14

标签: apache-spark elasticsearch-hadoop

火花是懒惰吧? 那么 HttpHeaders.prototype.init = function () { var _this = this; if (!!this.lazyInit) { if (this.lazyInit instanceof HttpHeaders) { this.copyFrom(this.lazyInit); } else { this.lazyInit(); } this.lazyInit = null; if (!!this.lazyUpdate) { this.lazyUpdate.forEach(function (update) { return _this.applyUpdate(update); }); this.lazyUpdate = null; } } }; 的作用是什么?

load()

如果start = timeit.default_timer() df = sqlContext.read.option( "es.resource", indexes ).format("org.elasticsearch.spark.sql") end = timeit.default_timer() print('without load: ', end - start) # almost instant start = timeit.default_timer() df = df.load() end = timeit.default_timer() print('load: ', end - start) # takes 1sec start = timeit.default_timer() df.show() end = timeit.default_timer() print('show: ', end - start) # takes 4 sec 是唯一的操作,我想show()不会花1秒的时间。因此,我得出的结论是load是一个动作(与spark转换相反)

加载实际上会将整个数据加载到内存中吗?我不这么认为,但是那是什么呢?

我已经搜索并查看了文档https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html,但没有帮助。.

2 个答案:

答案 0 :(得分:2)

如下面的代码所示,

tl; dr load()是一个DataFrameReader api(org.apache.spark.sql.DataFrameReader#load),它返回一个DataFrame,可以在其上应用Spark转换。

/**
   * Loads input in as a `DataFrame`, for data sources that support multiple paths.
   * Only works if the source is a HadoopFsRelationProvider.
   *
   * @since 1.6.0
   */
  @scala.annotation.varargs
  def load(paths: String*): DataFrame

需要创建一个DataFrame来执行转换。
要从路径(HDFS,S3等)创建数据帧,用户可以使用spark.read.format("<format>").load()。(还有特定于数据源的API,它可以像spark.read.parquet(<path>)这样自动加载文件)

为什么要花整整1秒钟?

在基于文件的来源中,这次可以归因于文件列表。在HDFS中,这些清单并不昂贵,就象S3这样的云存储而言,该清单非常昂贵,并且花费时间与文件数成正比。
在您的情况下,使用的数据源为elastic-search,该时间可归因于连接建立,收集元数据以执行分布式扫描等,具体取决于Elastic serach连接器impl。我们可以启用调试日志并检查更多信息。如果弹性搜索可以记录收到的请求,我们可以检查弹性搜索日志中是否触发了load()时间之后发出的请求。

答案 1 :(得分:0)

它什么都不做。它只是作为参数的sqlContext.read的一部分,您没有直接在读取时设置。读取允许指定数据格式。 DF或底层RDD的评估很懒惰。