sparkr dataframe使用正则表达式按列过滤

时间:2016-09-26 07:22:00

标签: r sparkr

我有一个名为推文的sparkR数据框,其中包含一个名为bodyText的列。

我想要做的是通过bodyText上的正则表达式条件过滤数据帧。所以例如通过推特过滤"拉力赛#34;或者"抗议"在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))

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

  

as.character.default(x)出错:     没有用于将此S4类强制转换为向量的方法   电话:主要... .local - &gt; [ - &gt; grepl - &gt; as.character - &gt; as.character.default

3 个答案:

答案 0 :(得分: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或使用的表达式无效。

答案 1 :(得分: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)

答案 2 :(得分:0)

另一种方法是使用SparkR:::rlike sparkdataframe

df_filtered <- SparkR:::filter(df,SparkR:::rlike(df$bodyText,"(?<=\\b)rally"))

语法是:

df_filtered <- SparkR:::filter(Dataframe,SparkR:::rlike(column_name,regex))

这比将spark数据帧转换为rdd然后再将其再次转换回数据帧更好。