【问题标题】:SQL LIKE in Spark SQLSpark SQL 中的 SQL LIKE
【发布时间】:2017-03-20 03:39:04
【问题描述】:

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

我正在执行连接的行看起来像这样,被称为“修订”:

表 A:

8NXDPVAE

表 B:

[4,8]NXD_V%

在 SQL 服务器 (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 加入,或者我要离开了吗?

【问题讨论】:

    标签: sql regex apache-spark apache-spark-sql


    【解决方案1】:

    你只是有点偏离。 Spark SQL 和 Hive 遵循 SQL 标准约定,其中 LIKE 运算符仅接受两个特殊字符:

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

    方括号没有特殊含义,[4,8] 仅匹配 [4,8] 文字:

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

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

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

    【讨论】:

      【解决方案2】:

      spark scala api 中 like 的语法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多