【问题标题】:Assign column in SparkR在 SparkR 中分配列
【发布时间】:2016-12-19 18:21:22
【问题描述】:

我正在尝试将代码从 PySpark 迁移到 SparkR。为了修改一些列,我在 PySpark 中使用了“withColumn”。但是,在 SparkR 中,它会生成一个新列。然后我尝试了类似

df$a <- f(df$a)

这很好。但是,假设我想在函数或 for 循环中使用它并为多个变量重复它​​。在这种情况下,很遗憾它不起作用:

df[['a']] <- f(df[['a']])

我意识到它在执行以下操作时确实起作用:

df$a <- f(df[['a']])

我绝对需要使用[[&lt;- 或其他方式进行评估。想法?

【问题讨论】:

    标签: r apache-spark apache-spark-sql sparkr


    【解决方案1】:

    With 列在 Spark 2.0.0+ 中应该可以正常工作

    library(magrittr)
    
    df <- createDataFrame(iris)
    df %>% withColumn("Sepal_Length", lit(1)) %>% columns
    ## [1] "Sepal_Length" "Sepal_Width"  "Petal_Length" "Petal_Width"  "Species" 
    

    但如果您使用早期版本,您始终可以使用 $&lt;- 作为函数:

    df <- createDataFrame(sqlContext, iris)
    
    df %>% `$<-`("Sepal_Length", lit(1)) %>% columns
    ## [1] "Sepal_Length" "Sepal_Width"  "Petal_Length" "Petal_Width"  "Species"
    
    df %>% `$<-`("Sepal_Length", lit(1)) %>% head
    ##   Sepal_Length Sepal_Width Petal_Length Petal_Width Species
    ## 1            1         3.5          1.4         0.2  setosa
    ## 2            1         3.0          1.4         0.2  setosa
    ## 3            1         3.2          1.3         0.2  setosa
    ## 4            1         3.1          1.5         0.2  setosa
    ## 5            1         3.6          1.4         0.2  setosa
    ## 6            1         3.9          1.7         0.4  setosa
    

    所以你需要让它与变量一起工作是do.call

    x <- "Sepal_Length"
    
    do.call(`$<-`, list(df, x, lit(1))) %>% columns
    

    【讨论】:

    • 嗨,按原样工作。但是,如果您尝试将表达式放在 for 循环或函数中,使用可变变量而不是“Sepal_Length”,它将将该变量解释为名称,而不是字符串。我尝试使用 NSE 来解决这个问题,但我不是专家,这很棘手。我不会将此标记为答案,因为它不能解决主要问题 - 能够在函数中使用表达式。无论如何,谢谢。
    猜你喜欢
    • 2017-07-06
    • 2015-12-24
    • 1970-01-01
    • 2016-06-13
    • 2015-12-16
    • 1970-01-01
    • 2015-12-26
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多