为什么组合器在分成多行时会发生阻塞,如下所示:
编译(因为所有在一个honkin大线上):
protected lazy val create: Parser[LogicalPlan] =
CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")" ~ (MAPPED ~> BY ~> "(" ~> ident <~ "," ~ colFamilies <~ ")") <~ opt(";") ^^ {
不编译:
protected lazy val create: Parser[LogicalPlan] =
CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")"
~ (MAPPED ~> BY ~> "(" ~> ident <~ "," ~ colFamilies <~ ")") <~ opt(";") ^^ {
[error] /shared/hwspark/sql/hbase/src/main/scala/org/apache/spark/sql/hbase/HBaseSQLParser.scala:37: type mismatch;
[error] found : HBaseSQLParser.this.Parser[Seq[org.apache.spark.sql.catalyst.expressions.Expression]]
[error] required: HBaseSQLParser.this.Parser[org.apache.spark.sql.catalyst.plans.logical.LogicalPlan]
[error] CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")"
[error]
答案 0 :(得分:3)
看起来你正在违反Scala规则进行分号插入。要在第二行继续表达式,您需要确保在第一行的末尾没有插入分号。最简单的方法是使用运算符结束第一行(其右操作数将在下一行)。换句话说,尝试将~
从(MAPPED ...
的前面移回到上一行的末尾。