2016-09-26 37 views
1

我有一个sparkR数据框称为Tweets与列名为bodyTextsparkr数据框按列过滤使用正则表达式

我想要做的是通过bodyText上的正则表达式条件过滤数据帧。因此,例如,通过在bodyText中具有“反弹”或“抗议”的推文进行过滤。

我迄今为止尝试是:

subset(twitter_df, grepl("(?<=\\b)rally", twitter_df$bodyText, ignore.case = TRUE)) 
filter(twitter_df, grepl("(?<=\\b)rally", twitter_df$bodyText, ignore.case = TRUE)) 

但在这两种情况下收到此错误:

Error in as.character.default(x) : no method for coercing this S4 class to a vector Calls: main ... .local -> [ -> grepl -> as.character -> as.character.default

回答

0

您可以在Spark数据帧转换为RDD,应用过滤器和转换回:

# setup reproducable sample 
df <- data.frame(id=c(1:4), bodyText=c("rally","protest","text1","text2")) 
head(twitter_df.filtered) 
twitter_df <- as.DataFrame(df) 
head(twitter_df) 


# convert to rdd 
twitter_df.rdd <- SparkR:::toRDD(twitter_df) 
# filter rdd 
twitter_df.rdd.filtered <- SparkR:::filterRDD(twitter_df.rdd, function(s) { grepl("(?<=\\b)rally", s$bodyText, ignore.case = TRUE, perl = TRUE) }) 
# convert to Spark data frame 
twitter_df.filtered <- as.DataFrame(twitter_df.rdd.filtered) 
head(twitter_df.filtered) 

注意参数perl设置为TRUE或T他用表达无效。

+0

作品,非常感谢。我只需要添加sqlContext as.DataFrame: 'as.DataFrame(sqlContext,df)' –

0

如果使用Spark Sql in SparkR,它可能是那样简单:

df <- data.frame(id=c(1:4), bodyText=c("rally","protest","text1","text2")) 

createOrReplaceTempView(df, "tweets") 
rallys <- head(sql("SELECT * FROM tweets WHERE bodyText rlike 'rally'")) 

print(rallys)