Databricks中R用户寻求sparklyr替代registerTempTable的高效方法
在sparklyr中快速实现PySpark registerTempTable的等效功能
嘿,我明白你的困惑了!先帮你理清关键差异:你同事的PySpark流程之所以快,核心是**registerTempTable(现在更推荐createOrReplaceTempView)只是注册一个临时视图,并不会触发任何实际的数据加载或计算**——他的cache()也只是标记数据要缓存,只有当执行类似count()、show()这类action操作时,才会真正把数据加载到内存。而你之前用memory=TRUE或者tbl_cache时,sparklyr会立即触发数据加载的action,这才导致耗时过长。
在sparklyr里,你可以用以下两种方法快速实现和registerTempTable等效的功能,它们都不会触发数据的实际计算,速度和你同事的操作一样快:
方法1:使用sdf_register()
这个函数专门用来将sparklyr的DataFrame注册为Spark临时视图,完全对应PySpark的registerTempTable:
# 第一步:读取Parquet表,保持memory=FALSE(仅创建表引用,不加载数据) data <- spark_read_parquet(sc = sc, path = "parquet_table", memory = FALSE) %>% dplyr::select(column1, column2) # 第二步:注册为临时视图,命名为"data" data <- sdf_register(data, name = "data")
方法2:使用dplyr::compute()
compute()也可以注册临时视图,同时会为视图创建一个逻辑计划(后续如果需要重复查询,Spark可以优化执行),同样不会立即加载数据:
data <- spark_read_parquet(sc = sc, path = "parquet_table", memory = FALSE) %>% dplyr::select(column1, column2) %>% compute(name = "data")
关于缓存的补充
如果你后续确实需要缓存数据,不要在注册视图前用memory=TRUE或tbl_cache,而是按照和PySpark一致的流程:
- 先注册临时视图(用上面两种方法)
- 标记缓存:
tbl_cache(sc, "data") - 触发实际缓存:执行一个action操作(比如
dplyr::count(tbl(sc, "data")))
这样就和你同事的cache() + registerTempTable流程完全对齐了,只有当你真正需要的时候才会加载数据,避免不必要的等待。
内容的提问来源于stack exchange,提问作者Kenneth Singh
相关产品推荐
相关产品推荐

