Dan*_*sin 7 regex sql apache-spark apache-spark-sql
我正在尝试使用LIKE条件在Spark SQL中实现连接.
我正在执行连接的行看起来像这样,称为"修订版":
表A:
8NXDPVAE
Run Code Online (Sandbox Code Playgroud)
表B:
[4,8]NXD_V%
Run Code Online (Sandbox Code Playgroud)
在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")
Run Code Online (Sandbox Code Playgroud)
该计划如下:
== 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>
Run Code Online (Sandbox Code Playgroud)
是否可以像这样执行LIKE连接或者我离开了?
你只有一点点.Spark SQL和Hive遵循SQL标准约定,其中LIKEoperator只接受两个特殊字符:
_ (下划线) - 匹配任意字符.% (百分比) - 匹配任意字符序列.方括号没有特殊含义,[4,8]只匹配[4,8]文字:
spark.sql("SELECT '[4,8]' LIKE '[4,8]'").show
Run Code Online (Sandbox Code Playgroud)
+----------------+
|[4,8] LIKE [4,8]|
+----------------+
| true|
+----------------+
Run Code Online (Sandbox Code Playgroud)
要匹配复杂模式,您可以使用RLIKE支持Java正则表达式的运算符:
spark.sql("SELECT '8NXDPVAE' RLIKE '^[4,8]NXD.V.*$'").show
Run Code Online (Sandbox Code Playgroud)
+-----------------------------+
|8NXDPVAE RLIKE ^[4,8]NXD.V.*$|
+-----------------------------+
| true|
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6007 次 |
| 最近记录: |