2017-04-22 125 views
0

我想使用PyAthenaJDBC库制作一个python脚本,它将使用雅典娜查询S3存储桶。图书馆是相当不错,但我有格式问题。PyAthenaJDBC查询字符串格式问题

我在单独的函数中将查询构造为字符串,并将查询字符串传递回cursor.execute(query)

查询字符串中有引号,看起来像这样:

SELECT day, elb_name 
    ,COUNT (*) AS c 
    ,100.0 * (
     1.0 - (
      SUM (
       CASE 
        WHEN elb_response_code LIKE '5%' THEN 1 
        ELSE 0 
       END 
      )/cast(COUNT (*) as double) 
     ) 
    ) AS success_rate 
    ,100.0 * SUM (
     CASE 
      WHEN backend_processing_time < 0.1 THEN 1 
      ELSE 0 
     END 
    )/cast(COUNT (*) as double) AS t_lt_pt1 
    ,100.0 * SUM (
     CASE 
      WHEN backend_processing_time < 1 THEN 1 
      ELSE 0 
     END 
    )/cast(COUNT (*) as double) AS t_lt_1 
    ,100.0 * SUM (
     CASE 
      WHEN backend_processing_time < 5 THEN 1 
      ELSE 0 
     END 
    )/cast(COUNT (*) as double) AS t_lt_5 
    ,100.0 * SUM (
     CASE 
      WHEN backend_processing_time < 10 THEN 1 
      ELSE 0 
     END 
    )/cast(COUNT (*) as double) AS t_lt_10 
    FROM elb_logs_raw_native_part 
    WHERE year = '2017' AND 
    month = '03' AND 
    elb_name is not NULL AND 
    elb_name != '' 
    GROUP BY day, elb_name 
    ORDER BY c DESC 

这将导致第二单引号错误的`LIKE“5%”语句。

ValueError: unsupported format character ''' (0x27) at index 186 

我能避免错误,并成功地通过改变此线在库https://github.com/laughingman7743/PyAthenaJDBC/blob/master/pyathenajdbc/formatter.py#L115

return (operation % kwargs).strip()

中的代码,operation == query(上面粘贴)和kwargs == {}

执行查询,以 return (operation).strip()此时

我的具体问题是,我构建我的查询不正确?或者,这是我不明白的本地字符串格式,试图用空字典替换是一个坏主意?

回答

1

如果查询用作要格式化的字符串,则需要将要生存的任何%个字符加倍为文字%个字符。

而不是WHEN elb_response_code LIKE '5%' THEN 1,请使用WHEN elb_response_code LIKE '5%%' THEN 1。在formatter.py中指定的行后,%%将被转换为单个%

+0

就是这样。我应该看到这一点。谢谢! – manisha