您可以使用SQL和DBI
库来实现。
假设您已将您的data.frame复制到Spark中。 (请注意,在colnames
函数调用中存在拼写错误,您已将第一列的名称设置为“co1”,而不是“col1”)。现在
copy_to(sc, df)
,您可以创建一个新的Spark表所需的列有这样的:
DBI::dbSendQuery(sc, "CREATE TABLE new_df AS
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5
FROM df t1
LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G,
'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q,
'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC")
现在,你可以参考这个新的Spark表和Sparklyr使用它:
ref_new_df <- tbl(sc, "new_df")
我希望这会有所帮助。
编辑来显示结果
> copy_to(sc, df)
> DBI::dbSendQuery(sc, "CREATE TABLE new_df AS
+ SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5
+ FROM df t1
+ LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G,
+ 'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q,
+ 'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC")
<DBISparkResult>
SQL CREATE TABLE new_df AS
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5
FROM df t1
LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G,
'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q,
'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC
ROWS Fetched: 0 [complete]
Changed: 0
我没试过在sparklyr,但也有一些dplyr后端可以只包住功能'do'和数据传递的'.' – alistaire
我猜测你已经看到这是sparklyr GitHub上的问题#255。我也想找到一个临时解决方案。 – Zafar