【问题标题】:what does load() do in spark?load() 在 spark 中做了什么?
【发布时间】:2019-11-11 02:30:16
【问题描述】:

spark 很懒,对吧? 那么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() 是唯一的动作,我猜load 不会像1 秒那样花费太多时间。所以我的结论是load() 是一个动作(而不是火花中的转换)

load 是否真的将整个数据加载到内存中?我不这么认为,但它有什么作用呢?

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

【问题讨论】:

  • load 只会给出一个指向数据位置的指针,这将创建一个数据帧。 sparks rdd 模型是惰性的,除非您对 rdd/dataframe/dataset 执行操作,否则它不会将数据完全加载到内存中。如果您了解 sparks rdd lineage,您将了解这一点。
  • 好的...如果它是懒惰的,为什么要花整整 1 秒才能到达 load()
  • 由于其他一些原因。可能是,但这不是动作。

标签: apache-spark elasticsearch-hadoop


【解决方案1】:

它什么都不做。它只是作为参数的 sqlContext.read 的一部分,您没有直接在读取时设置。 read 允许指定数据格式。正如他们所说,DF 或底层 RDD 被延迟评估。

【讨论】:

  • 同意bluephantom。另请参阅我的评论
【解决方案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 连接器实现。我们可以启用调试日志并检查更多信息。如果弹性搜索有办法记录它收到的请求,我们可以检查弹性搜索日志中在load() 被触发之后发出的请求。

【讨论】:

  • 我在 databricks 文档中找不到作为转换的负载。
  • 加载不是转换,它是一个 DataFrameReader api,用于从数据源创建数据帧。你可以应用转换,一旦你load
  • 我的错,这不是转换,它是 DataframeReader org.apache.spark.sql.DataFrameReader#load.. @thebluephantom 之上的 api,感谢您的告知。我现在已经确定了答案
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2014-08-03
  • 2012-02-12
  • 2010-10-26
  • 2019-07-12
  • 2010-11-20
  • 2011-07-24
  • 2012-08-07
相关资源
最近更新 更多