【问题标题】:Use of substr() on DataFrame column in SparkR在 SparkR 中的 DataFrame 列上使用 substr()
【发布时间】:2016-09-21 15:22:10
【问题描述】:

我正在使用 SparkR,并希望使用 substr() 命令来隔离列中包含的字符串的最后一个字符。如果我将 StartPosition 和 EndPosition 设置为常量,我可以让 substr() 工作:

substr(sdfIris$Species, 8, 8)

但是当我尝试使用来自 DataFrame 的值设置这些参数时:

sdfIris <- createDataFrame(sqlContext, iris)
sdfIris$Len <- length(sdfIris$Species)
sdfIris$Last <- substr(sdfIris$Species, sdfIris$Len, sdfIris$Len)

as.integer(start - 1) 中的错误:无法将“S4”类型强制转换为“整数”类型的向量

看来sdfIris$Len返回的结果可能是单格DataFrame,参数需要整数。

我试过collect(sdfIris$Len),但是:

(函数(类,fdef,mtable)中的错误:无法为签名“列”的函数“收集”找到继承的方法

这似乎不协调。 substr() 似乎将 sdfIris$Len 视为 DataFrame,但 collect() 似乎将其视为 Column。

我已经通过使用registerTempTable 并使用 SparkSQL 的 substr 来隔离最后一个字符来确定一种解决方法,但我希望避免切换到 SQL 的不必要步骤。

如何在具有动态 Start 和 Finish 参数的 DataFrame 列上使用 SparkR substr()

【问题讨论】:

    标签: r apache-spark dataframe substr sparkr


    【解决方案1】:

    这不是最佳的,但你可以使用expr:

    df <- createDataFrame(
      sqlContext,
      data.frame(s=c("foo", "bar", "foobar"), from=c(1, 2, 0), to=c(2, 3, 5))
    )
    
    select(df, expr("substr(s, from, to)")) %>% head()
    
    ##   substr(s,from,to)
    ## 1                fo
    ## 2                ar
    ## 3             fooba
    

    selectExpr:

    selectExpr(df, "substr(s, from, to)") %>% head()
    
    ##   substr(s,from,to)
    ## 1                fo
    ## 2                ar
    ## 3             fooba
    

    以及等效的 SQL 查询。

    【讨论】:

    • 感谢@zero323!这暂时可行——至少我不必先注册临时表()。我会尝试询问 Spark 项目我需要的是 bug 还是功能请求。
    • 功能请求。 JVM 上没有具有动态偏移量的数据帧 API,它不能在 R 中公开吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2016-09-16
    • 1970-01-01
    • 2018-06-13
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多