您可以使用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