我使用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()
1条答案
按热度按时间a14dhokn1#
看起来你只需要指定正确的捕获组索引,根据你的正则表达式定义,它是8。您定义的捕获组8是
(\\d+(?:\\.\\d+)?S)
,它包含一个尾随文字“S”-这与输入中的“0.46S”匹配。请注意,Spark SQLregexp_extract(str, regexp[, idx])
中的默认捕获组索引为1(参见Spark SQL文档),对于您的输入'PT0.46S',该索引为空,因为您定义的第一个捕获组没有匹配项:(\\d+(?:\\.\\d+)?Y)
。另外,我不知道这是否是你的IDE中的格式问题,但4个反斜杠对Spark来说有点太多了-试试2个。所以你的Spark SQL看起来像这样:
退货:
P.S.在另一个注意事项,我强烈建议尝试Regex 101,如果你还没有。对正则表达式进行故障排除的最佳位置,它们也有一个UI来查看您实际捕获的模式。