2016-10-30 87 views
0

我正在使用spark R,我想基於現有列的字符串修改將列添加到SparkDataFrame。考慮以下SparkDataFrame:如何使用一組SQL表達式將列添加到SparkDataFrame?

head(df) 
    id             address 
    1 street_X, postal_code_X, neighborhood_X, county_name_X 
    2       neighborhood_Y, county_name_Y 
    3    postal_code_Z, neighborhood_Z, county_name_Z 

我需要添加一個只包含鄰域的列。我設法如下進入一個新的SparkDataFrame提取此列:

new_df <- selectExpr(df, "SUBSTRING_INDEX(address, ',', -2) AS neighborhood") 
new_df <- selectExpr(new_df, "SUBSTRING_INDEX(neighborhood, ',', 1) AS neighborhood") 

head(new_df) 

neighborhood 
neighborhood_X 
neighborhood_Y 
neighborhood_Z 

但我怎麼可以添加此列附近原來的DF(相當於R中cbind /我檢查withColumn,但並沒有設法給它結合與selectExpr)?

+0

你有沒有試過JOIN命令?選擇是選擇列的子集,而不是添加新列的投影 –

+0

謝謝,你的意思是加入(df,df_new)?我收到一個ERROR RBackendHandler,指出spark.sql.crossJoin.enabled應該設置爲true(笛卡爾連接可能過於昂貴並且默認情況下處於禁用狀態)。我需要檢查如何做到這一點。 – kanimbla

+1

其實,沒關係......你爲什麼不能在相同的選擇內兩次調用SUBSTRING? –

回答

2

嘗試是這樣的

只需選擇其他列

new_df <- selectExpr(df, "id", "address", 
    "SUBSTRING_INDEX(SUBSTRING_INDEX(address, ',', -2), ',', 1) AS neighborhood") 

這或許還可以

new_df <- selectExpr(df, "*", 
    "SUBSTRING_INDEX(SUBSTRING_INDEX(address, ',', -2), ',', 1) AS neighborhood") 
+0

謝謝!我收到以下錯誤:錯誤invokeJava(isStatic = FALSE,OBJID $ ID,方法名,...):org.apache.spark.sql.catalyst.parser.ParseException:外部輸入... – kanimbla

+0

我可能會錯過一個括號。我在移動 –

+0

其實,我現在也在手機上,所以我會在幾個小時後回來查看。乍看之下,雖然這些缺口對我來說很好看。 – kanimbla

相關問題