R和Sparklyr:为什么一个简单的查询这么慢?

v64noz0r  于 2023-04-07  发布在  Apache
关注(0)|答案(2)|浏览(122)

bounty还有2天到期。回答此问题可获得+500声望奖励。Funkwecker希望引起更多关注此问题。

这是我的代码我在数据库里运行

library(sparklyr)
library(dplyr)
library(arrow)

sc <- spark_connect(method = "databricks")
tbl_change_db(sc, "prod")
trip_ids <- spark_read_table(sc, "signals",memory=F) %>% 
            slice_sample(10) %>% 
            pull(trip_identifier)

虽然我只查询了10个样本,但代码运行得非常慢,需要几个小时。为什么?有没有办法提高性能?
谢谢大家!

nhhxz33t

nhhxz33t1#

看起来像是使用dplyrslice_sample函数对数据集进行采样,然后从中选择某个单列。问题是Spark引擎不知道这一点:你的采样发生在R中。这意味着完整的数据集是从存储的任何地方完全读取的,并完全发送到你的R引擎,只在那里进行二次采样。
你需要做的是在Spark本身中获取你的子集和列。你可以使用select(抓取单个列)和head(抓取N行)函数来做到这一点:

trip_ids <- head(select(spark_read_table(sc, "signals",memory=F), trip_identifier), 10L)
b4lqfgs4

b4lqfgs42#

另一个回答和评论已经涵盖了 * 为什么 * 查询需要这么长时间(您将整个表拖到driver/R中的时间比您希望的要早),但我想包括一个真正对数据进行采样的示例和另一种可以提供更多控制的方法(即使用SparkSQL的)。当使用Spark时,我试图将所有繁重的工作都作为实际的SQL查询来完成,所以我更喜欢选项2,但我把两个都包括进去了,以防其中一个比另一个更有用。

library(sparklyr)
library(dplyr)

sc = spark_connect(method = "databricks")
tbl_change_db(sc, "prod")

# Option 1, using a fraction (proportion in this case) to pull a random sample
spark_read_table(sc, "signals", memory = FALSE) %>%
  select(trip_identifier) %>%
  sdf_sample(fraction = .0001, replacement = FALSE, seed = NULL) %>%
  collect() %>% #this is not necessary, but it makes the pull-down to R explicit
  pull(trip_identifier)

# Option 2, using SparkSQL to run the query as you intended (sampling 10 rows)
sc %>%
  sdf_sql("SELECT trip_identifier FROM signals TABLESAMPLE (10 ROWS)") %>%
  collect() %>% #this is not necessary, but it makes the pull-down to R explicit
  pull(trip_identifier)

相关问题