【问题标题】:DBI/Spark: how to store the result in a Spark Dataframe?DBI/Spark:如何将结果存储在 Spark Dataframe 中?
【发布时间】:2017-11-19 14:40:27
【问题描述】:

我正在使用sparklyr 进行一些分析,但我也有兴趣使用DBI 编写原始SQL 查询。

我可以运行以下查询

query <- "SELECT col1, FROM mydata WHERE some_condition"
dataframe <- dbGetQuery(spark_connection, query)

但这会将数据返回到 R 中(在数据框中)。

我想要的是将数据保留在 Spark 中并将其存储在另一个 Spark Dataframe 中,以便与 sparklyr 进一步交互。

有什么想法吗?

【问题讨论】:

  • 使用 DBI 的问题是内存。您将无法使用它获取大量数据。如果你的查询结果返回的数据量很大,就会压垮spark的驱动内存,导致内存不足的错误……所以如果你想用它来返回小数据集,你就不需要spark了。跨度>
  • 那么 DBI 不是您的解决方案;如果你想坚持使用 R,你应该使用常规 SparkR
  • 这不是 sparklyr 发生的事情,DBI 运行 sql 命令 a 返回一个 R DataFrame,这意味着它正在收集数据以在常规 R 上下文中实现它。
  • dbSendQuery 不提取任何记录...我认为它用于缓存表、创建视图等(Hive 查询语言 DSL)

标签: sql r apache-spark sparklyr r-dbi


【解决方案1】:

你也可以这样做:

mydata_spark_df <- tbl(sc, sql("select * from mydata"))

【讨论】:

    【解决方案2】:

    使用DBI 的问题是内存。您将无法使用它获取大量数据。如果你的查询结果返回的数据量很大,会压垮spark的驱动内存,导致内存不足的错误……

    sparklyr 发生的情况如下。 DBI 运行 sql 命令 a 返回 R DataFrame,这意味着它正在收集数据以在常规 R 上下文中实现它。

    因此,如果您想使用它来返回小型数据集,则不需要 spark。

    那么DBI 不是你的解决方案;如果您想为此坚持使用 R,则应该使用常规的 SparkR

    这是一个关于如何在sparkr 中使用sql 的示例:

    sc %>% spark_session %>% 
       invoke("sql", "SELECT 1") %>% 
       invoke("createTempView", "foo")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多