rlike regex不处理特殊字符



我很难获得(java) spark的rlike方法来处理特殊字符。通常,简单的转义\或引用QE将足以处理regex中的特殊字符,但它们似乎不起作用。

看下面的示例代码。它应该显示第2行& &;3表示匹配alist忽略情况中的一个项目。但是,下面的代码只显示匹配的第2行。

如何根据"动物"来筛选数据集的行?列与alist中的一个项匹配?

StructType schema = new StructType(new StructField[]{
new StructField("row_id", DataTypes.IntegerType, false, Metadata.empty()),
new StructField("animal", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> dataset = spark.createDataFrame(
Arrays.asList(
RowFactory.create(1, "Bat"),
RowFactory.create(2, "Dog"),
RowFactory.create(3, "Cat (Type Not Stated)"),
RowFactory.create(4, "Other.")
), schema);

List<String> alist = Arrays.asList(
"\QDOG\E",
"\QCat (Type Not Stated)\E");
dataset = dataset.filter(dataset.col("animal").rlike(
"(?i)\b("+String.join("|", alist)+")\b"
));
dataset.show(5, false);

您的问题不是\Q\E模式,而是\b字边界模式。

如果我通过删除\b模式来改变最终的rlikeregexp,如下所示:

dataset = dataset.filter(dataset.col("animal").rlike(
"(?i)("+String.join("|", alist)+")"
));

得到两行:

+------+---------------------+
|row_id|animal               |
+------+---------------------+
|2     |Dog                  |
|3     |Cat (Type Not Stated)|
+------+---------------------+

最新更新