我正在使用 PySpark v2.3.4 的 Jupyter Notebook 工作,该笔记本在 Java 8、Python 3.6(py4j==0.10.7)和 Scala 2.11 上运行,并且我有一个 Scala 案例类,它接受 scala.util.matching.Regex
( scala doc ) 作为参数,如下所示:
case class myClass(myString: String, myRegex: Regex)
我想从 myClass
构造一个对象,但我似乎不知道如何在 Python 中构造 scala.util.matching.Regex
对象/PySpark 环境。下面是我创建 Scala 正则表达式的一些尝试/文档,其中 sc
是我的 SparkContext。
sc._jvm.scala.util.matching.Regex("""(S|s)cala""")
- 错误:
构造函数 scala.util.matching.Regex([class java.lang.String]) 不存在
- 这个错误消息让我大吃一惊,因为 Scala 2.11 文档明确指出它的构造函数接受
java.lang.String
。
- 错误:
sc._jvm.scala.util.matching.Regex("(S|s)cala")
- 与上面相同的错误
sc._jvm.scala.util.matching.Regex(r"(S|s)cala")
- 与上面相同的错误
sc._jvm.scala.util.matching.Regex("(S|s)cala".r)
(他们在 Scala 中的做法)- 错误:Python 字符串没有属性“r”
sc._jvm.java.util.regex.Pattern.compile("(S|s)cala")
成功创建了 Java 正则表达式模式 - 并且 scala 文档明确指出 Scala regex 委托(delegate)给 Java regex 包...
任何帮助/建议将不胜感激!提前致谢!
最佳答案
我明白了哈哈
Scala Regex 采用名为 groupNames
的第二个参数。它是一个可变的字符串参数,应该接受长度为 0 的参数以及您想要的任意数量的字符串参数。但是,从 Python 解释器来看,这被视为必需参数,因此您必须将 None
传递到此参数中,以指示不填充第二个参数。
sc._jvm.scala.util.matching.Regex("(S|s)cala", None)
注意:我还没有弄清楚如何传递 vararg...传递逗号分隔的字符串、数组和元组不起作用...对此有任何帮助将非常感谢:)
关于java - 在 PySpark 中为 Scala 类构造函数初始化 Scala 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62314073/