Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sparksql中的类SQL_Sql_Regex_Apache Spark_Apache Spark Sql - Fatal编程技术网

sparksql中的类SQL

sparksql中的类SQL,sql,regex,apache-spark,apache-spark-sql,Sql,Regex,Apache Spark,Apache Spark Sql,我正在尝试使用一个类似的条件在Spark SQL中实现一个连接 我正在执行联接的行如下所示,称为“修订”: 表A: 8NXDPVAE 表B: [4,8]NXD_V% 在SQL server上执行联接(A.revision LIKE B.revision)工作正常,但在Spark SQL中执行相同操作时,联接不会返回任何行(如果使用内部联接)或表B的空值(如果使用外部联接) 这是我正在运行的查询: val joined = spark.sql("SELECT A.revision, B.rev

我正在尝试使用一个类似的条件在Spark SQL中实现一个连接

我正在执行联接的行如下所示,称为“修订”:

表A:

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>
==物理计划==
BroadcastedNestedLoopJoin BuildLeft,LeftOuter,修订版#15类似修订版#282,false
:-BroadcastExchange标识广播模式
:+-*项目[修订版#15]
:+-*扫描JDBCRelation(RAWDATA)[revision#15]PushedFilters:[EqualTo(bulk_id,2016092419270100198)],ReadSchema:struct
+-*扫描jdbcorrelation(TPTYPE)[修订版#282]ReadSchema:struct

是否可以执行类似的连接,或者我离此很远?

您只差一点点。Spark SQL和Hive遵循SQL标准约定,其中
LIKE
运算符只接受两个特殊字符:

  • (下划线)-匹配任意字符的
  • %
    (百分比)-匹配任意字符序列的
方括号没有特殊含义,
[4,8]
只匹配
[4,8]
文字:

spark.sql("SELECT '[4,8]' LIKE '[4,8]'").show
+----------------+
|[4,8]类似于[4,8]|
+----------------+
|真的|
+----------------+
要匹配复杂模式,可以使用支持Java正则表达式的
RLIKE
运算符:

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

spark scala api中类似的语法:

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