【问题标题】:How to manipulate Spark Dataframe in R with sparklyr?如何使用 sparklyr 在 R 中操作 Spark Dataframe?
【发布时间】:2019-11-15 15:41:08
【问题描述】:

我正在研究 Spark 环境,并且正在尝试处理一些以 tbl_spark 形式出现的数据。问题是我无法对其应用任何常用的数据操作功能。

我已经使用df <- spark_read_table(sc,"tb_krill_sensordatatable_phoenix") 导入它,并且似乎成功,但是,当我尝试使用tidyr::spread() 旋转它时,它说该方法不适用于tbl_spark。

我现在要做的是:df_tbl <- as_tibble(df)。但是,它已经运行了几个小时,但什么也没发生。

我不知道我是否应该使用其他函数来导入它,而不是 spark_read_table(),或者我是否应该在 R 中转换为另一种常用的数据帧格式。


df_phoenix <- spark_read_table(sc,"tb_krill_sensordatatable_phoenix")
class(df_phoenix)
# [1] "tbl_spark" "tbl_sql"   "tbl_lazy"  "tbl"  

base_spread <- df_phoenix %>% 
   spread(key = sensorname, value = sensorvalue)
#Error in UseMethod("spread_") : 
#  no applicable method for 'spread_' applied to an object of class "c('tbl_spark', 'tbl_sql', 'tbl_lazy', 'tbl')"

aux <- as_tibble(df_phoenix)
#this one takes forever and nothing happens

【问题讨论】:

  • 是的,tidyr::spread() 不起作用。你可以使用sdf_pivot
  • 也许你正试图在你使用as_tibble的地方做aux &lt;- df_phoenix %&gt;% collect()

标签: r apache-spark-sql tidyr sparklyr tibble


【解决方案1】:

不妨试试

base_spread <- df_phoenix %>% 
                sdf_pivot(sensorvalue ~ sensorname, fun.aggregate = list(Value = "first"))

获得与tidyr:spread 相同的功能。

如果你想使用tidyr函数,你必须将数据导入R,这可以使用

df <- df_phoenix %>% collect()

【讨论】:

  • 感谢您的回答!虽然我收到了这个错误:> base_spread % + sdf_pivot(sensorvalue ~ sensorname, + fun.aggregate = list(Value = "first")) 错误:org.apache.spark.sql.AnalysisException:不能在(传感器名称、传感器时间、传感器值)中解析列名“值”;我应该提到还有一个 sensortime 列,它可以作为 sensorname 列中的一个值。
  • Value有一个占位符;从您的数据中替换它适当的列名称。请参阅示例here。也许如果你能提供一个示例问题,如果这没有帮助。
猜你喜欢
  • 2023-03-23
  • 2022-12-15
  • 2017-04-27
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多