load() 在 spark 中做了什么?
what does load() do in spark?
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()
是一个动作(与 spark 中的转换相反)
加载实际上是将整个数据加载到内存中吗?我不这么认为,但它有什么作用呢?
我已经搜索并查看了文档 https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html 但没有帮助..
它什么都不做。它只是把sqlContext.read的一部分作为参数,你没设置就直接读了。 read 允许指定数据格式。正如他们所说,DF 或底层 RDD 被延迟评估。
tl;dr load()
是一个 DataFrameReader api(org.apache.spark.sql.DataFrameReader#load
),从下面的代码可以看出,returns 一个 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 connector impl。我们可以启用调试日志并检查更多信息。如果 elastic search 有办法记录它收到的请求,我们可以检查 elastic search 日志中在 load()
时间后发出的请求。
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()
是一个动作(与 spark 中的转换相反)
加载实际上是将整个数据加载到内存中吗?我不这么认为,但它有什么作用呢?
我已经搜索并查看了文档 https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html 但没有帮助..
它什么都不做。它只是把sqlContext.read的一部分作为参数,你没设置就直接读了。 read 允许指定数据格式。正如他们所说,DF 或底层 RDD 被延迟评估。
tl;dr load()
是一个 DataFrameReader api(org.apache.spark.sql.DataFrameReader#load
),从下面的代码可以看出,returns 一个 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 connector impl。我们可以启用调试日志并检查更多信息。如果 elastic search 有办法记录它收到的请求,我们可以检查 elastic search 日志中在 load()
时间后发出的请求。