使用正则表达式按列过滤 sparkr 数据框

sparkr dataframe filter by column using regex

我有一个名为 Tweets 的 sparkR 数据框,其中有一列名为 bodyText

我想做的是通过 bodyText 上的正则表达式条件过滤数据框。因此,例如按 bodyText 中具有 "rally" 或 "protest" 的推文进行过滤。

目前我尝试过的是:

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 或使用的表达式无效。

如果您使用 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)

另一种方法是使用 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 然后再将其再次转换回数据帧要好。