我一直在与sparklyr
合作,将大型cassandra表格带入spark,将这些表格注册到R并对其进行dplyr
操作。
我已成功导入cassandra表,其代码如下所示:
# import cassandra table into spark
cass_df <- sparklyr:::spark_data_read_generic(
sc, "org.apache.spark.sql.cassandra", "format",
list(keyspace = "cass_keyspace", table = "cass_table")
) %>%
invoke("load")
# register table in R
cass_tbl <- sparklyr:::spark_partition_register_df(
sc, cass_df, name = "cass_table", repartition = 0, memory = TRUE)
)
其中一些cassandra表非常大(> 85亿行)并且需要一段时间才能导入/注册,有些会导致内存溢出,即使有6个节点运行总共60个内核和192 GB RAM。但是,我通常只需要每个cassandra数据库中的一些列。
我的问题是:
SQL
/ CQL
类型查询如SELECT name FROM cass_table WHERE id = 5
)?我尝试在选项列表中添加这样的查询作为附加选项,即:
list(. . . , select = "id")
以及在%>% invoke("load")
之前将其作为单独的管道调用,即:
invoke("option", "select", "id") %>%
# OR
invoke("option", "query", s"select id from cass_table") %>%
但这些都行不通。有什么建议吗?
答案 0 :(得分:4)
您可以跳过预先缓存并选择感兴趣的列:
session <- spark_session(sc)
# Some columns to select
cols <- list("x", "y", "z")
cass_df <- session %>%
invoke("read") %>%
invoke("format", "org.apache.spark.sql.cassandra") %>%
invoke("options", as.environment(list(keyspace="test"))) %>%
invoke("load") %>%
# We use select(col: String, cols* String) so the first column
# has to be used separately. If you want only one column the third argument
# has to be an empty list
invoke("select", cols[[1]], cols[2:length(cols)]) %>%
# Standard lazy cache if you need one
invoke("cache")
如果您使用的谓词可以显着减少pushdown
选项到"true"
(默认),并在缓存之前使用filter
。
如果要传递更复杂的查询,请注册临时视图和sql
方法:
session %>%
invoke("read") %>%
...
invoke("load") %>%
invoke("createOrReplaceTempView", "some_name")
cass_df <- session %>%
invoke("sql", "SELECT id FROM some_name WHERE foo = 'bar'") %>%
invoke("cache")