SQL LIKE in Spark SQL



我正在尝试在Spark SQL中使用LIKE条件实现连接。

我正在执行连接的行看起来像这样,被称为'revision':

表答:

8NXDPVAE
表B:

[4,8]NXD_V%

在SQL server (A.revision LIKE B.revision)上执行连接工作得很好,但是在Spark SQL中执行相同的连接时,连接不返回行(如果使用内连接)或表B的空值(如果使用外连接)。

这是我正在运行的查询:

val joined = spark.sql("SELECT A.revision, B.revision FROM RAWDATA A LEFT JOIN TPTYPE B ON A.revision LIKE B.revision")

计划如下:

== Physical Plan ==
BroadcastNestedLoopJoin BuildLeft, LeftOuter, revision#15 LIKE revision#282, false
:- BroadcastExchange IdentityBroadcastMode
:  +- *Project [revision#15]
:     +- *Scan JDBCRelation(RAWDATA) [revision#15] PushedFilters: [EqualTo(bulk_id,2016092419270100198)], ReadSchema: struct<revision>
+- *Scan JDBCRelation(TPTYPE) [revision#282] ReadSchema: struct<revision>

是否有可能执行像这样的LIKE连接或我的方式?

你只是有点不对劲。Spark SQL和Hive遵循SQL标准约定,LIKE操作符只接受两个特殊字符:

  • _(下划线)-匹配任意字符。
  • %(%) -匹配任意字符序列。

方括号没有特殊含义,[4,8]只匹配[4,8]字面值:

spark.sql("SELECT '[4,8]' LIKE '[4,8]'").show
+----------------+
|[4,8] LIKE [4,8]|
+----------------+
|            true|
+----------------+

要匹配复杂的模式,您可以使用RLIKE操作符,它支持Java正则表达式:

spark.sql("SELECT '8NXDPVAE' RLIKE '^[4,8]NXD.V.*$'").show
+-----------------------------+
|8NXDPVAE RLIKE ^[4,8]NXD.V.*$|
+-----------------------------+
|                         true|
+-----------------------------+

spark scala api中like的语法:

dataframe.filter(col("columns_name").like("regex"))

相关内容

  • 没有找到相关文章

最新更新