使用正则表达式按列过滤 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 然后再将其再次转换回数据帧要好。
我有一个名为 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 然后再将其再次转换回数据帧要好。