pyspark Regex在Athena中工作,但在Spark SQL中不工作,即使在转义字符后也是如此

xzv2uavs  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(131)

我使用Spark SQL将持续时间转换为秒。这是我在Athena尝试过的,效果很好。
雅典娜密码:

`SELECT regexp_extract(duration, '^P(?!$)(\d+(?:\.\d+)?Y)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?W)?(\d+(?:\.\d+)?D)?(T(?=\d)(\d+(?:\.\d+)?H)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?S)?)?$') as sec 
FROM table 1 where duration = 'PT0.46S'`

输出:0.46S

即使使用反斜杠“”,相同的代码也会返回null。我也试过在select子句之前使用“r”,但它不起作用。
我需要改变什么方法才能让它在Spark SQL中工作
Spark SQL代码:

> spark.sql("SELECT regexp_extract(duration,
> '^P(?!$)(\\\\d+(?:\\\\.\\\\d+)?Y)?(\\\\d+(?:\\\\.\\\\d+)?M)?(\\\\d+(?:\\\\.\\\\d+)?W)?(\\\\d+(?:\\\\.\\\\d+)?D)?(T(?=\\\\d)(\\\\d+(?:\\\\.\\\\d+)?H)?(\\\\d+(?:\\\\.\\\\d+)?M)?(\\\\d+(?:\\\\.\\\\d+)?S)?)?$')
> as sec FROM table where duration = 'PT0.46S'").show()

输出:null

a14dhokn

a14dhokn1#

看起来你只需要指定正确的捕获组索引,根据你的正则表达式定义,它是8。您定义的捕获组8是(\\d+(?:\\.\\d+)?S),它包含一个尾随文字“S”-这与输入中的“0.46S”匹配。请注意,Spark SQL regexp_extract(str, regexp[, idx])中的默认捕获组索引为1(参见Spark SQL文档),对于您的输入'PT0.46S',该索引为空,因为您定义的第一个捕获组没有匹配项:(\\d+(?:\\.\\d+)?Y)
另外,我不知道这是否是你的IDE中的格式问题,但4个反斜杠对Spark来说有点太多了-试试2个。所以你的Spark SQL看起来像这样:

spark.sql(
    """SELECT regexp_extract(
        duration,
        '^P(?!$)(\\d+(?:\\.\\d+)?Y)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?W)?(\\d+(?:\\.\\d+)?D)?(T(?=\\d)(\\d+(?:\\.\\d+)?H)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?S)?)?$',
        8
    ) as sec FROM table where duration = 'PT0.46S'
    """
).show()

退货:

+-----+
|  sec|
+-----+
|0.46S|
+-----+

P.S.在另一个注意事项,我强烈建议尝试Regex 101,如果你还没有。对正则表达式进行故障排除的最佳位置,它们也有一个UI来查看您实际捕获的模式。

相关问题