sparkr数据框按列过滤使用正则表达式
问题描述:
我有一个sparkR
数据框称为Tweets与列名为bodyText
。sparkr数据框按列过滤使用正则表达式
我想要做的是通过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
答
您可以在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他用表达无效。
答
如果使用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)
作品,非常感谢。我只需要添加sqlContext as.DataFrame: 'as.DataFrame(sqlContext,df)' –