这里使用的pyspark的->符号叫什么?如果我想查询谷歌的查询,使用这个怎么办?我想知道如何用这个做“或”条件。我以为这是lambda,但我们有一个lambda关键字,这也不是' map '。
->
lambda
map
spark.sql.functions.expr('filter((calls, x -> substring(x.call, 0, 23)))')
uwopmtnx1#
这实际上与lambda表达式做同样的事情。在Python中,'filter((calls, x -> substring(x.call, 0, 23)))'部分只是一个字符串。在这个字符串中发生的事情不再是Python的事情了(因此不需要使用lambda关键字)。
'filter((calls, x -> substring(x.call, 0, 23)))'
spark.sql.functions.expr函数期望类似SQL的字符串作为其输入。Spark使用ANTLR将这些类似SQL的字符串解析为查询计划。这个ANTLR解析器使用.g4文件来定义要解析的语法。在源代码中的这些文件中,我们可以确认我在这里所说的(这里使用Spark v3.4.1):在SqlBaseLexer.g4中,->符号被称为ARROW:
spark.sql.functions.expr
.g4
SqlBaseLexer.g4
ARROW
ARROW: '->';
在SqlBarseParser.g4中,这些ARROW表达式得到标签lambda:
SqlBarseParser.g4
| identifier ARROW expression #lambda | LEFT_PAREN identifier (COMMA identifier)+ RIGHT_PAREN ARROW expression #lambda
在没有深入了解ANTLR如何工作的情况下,您可以看到这个ARROW获得了标签lambda,这暗示了这样一个事实,即它被解析为lambda表达式,但只是具有不同的语法。
1条答案
按热度按时间uwopmtnx1#
这实际上与lambda表达式做同样的事情。在Python中,
'filter((calls, x -> substring(x.call, 0, 23)))'
部分只是一个字符串。在这个字符串中发生的事情不再是Python的事情了(因此不需要使用lambda
关键字)。一些额外的信息可能会使这里发生的事情变得有点模糊
spark.sql.functions.expr
函数期望类似SQL的字符串作为其输入。Spark使用ANTLR将这些类似SQL的字符串解析为查询计划。这个ANTLR解析器使用.g4
文件来定义要解析的语法。在源代码中的这些文件中,我们可以确认我在这里所说的(这里使用Spark v3.4.1):在
SqlBaseLexer.g4
中,->
符号被称为ARROW
:在
SqlBarseParser.g4
中,这些ARROW
表达式得到标签lambda
:在没有深入了解ANTLR如何工作的情况下,您可以看到这个
ARROW
获得了标签lambda
,这暗示了这样一个事实,即它被解析为lambda表达式,但只是具有不同的语法。