2017-04-22 2 views
0

Ich versuche, die PyAthenaJDBC-Bibliothek zu verwenden, um ein Python-Skript zu erstellen, das einen S3-Bucket mit Athena abfragen wird. Die Bibliothek ist ziemlich gut, aber ich habe Probleme mit der Formatierung.PyAthenaJDBC Abfragezeichenfolge Formatierung Problem

Ich konstruiere die Abfragen als Zeichenfolgen in einer separaten Funktion und übergibt die Abfragezeichenfolge zurück an cursor.execute(query).

Der Query-String hat Anführungszeichen in ihm, und sieht wie folgt aus:

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 

Dieses ein Fehler auf dem zweiten einfachen Anführungszeichen in der LIKE '5%' Aussage verursacht.

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

ich den Fehler vermeiden kann und erfolgreich die Abfrage ausführen, indem Sie diese Zeile in der Bibliothek zu ändern https://github.com/laughingman7743/PyAthenaJDBC/blob/master/pyathenajdbc/formatter.py#L115

return (operation % kwargs).strip()-return (operation).strip() An dieser Stelle im Code, operation == query (klebte oben) und kwargs == {}

Meine spezifische Frage ist, bin ich meine Anfrage falsch strukturieren? Oder ist das etwas, was ich nicht über die native String-Formatierung verstehe, bei der es keinen Sinn macht, einen Ersatz durch ein leeres Wörterbuch zu machen?

Antwort

1

Wenn die Abfrage als zu formatierende Zeichenfolge verwendet wird, müssen Sie alle % Zeichen, die als Zeichen % erhalten bleiben sollen, verdoppeln.

Verwenden Sie anstelle von WHEN elb_response_code LIKE '5%' THEN 1WHEN elb_response_code LIKE '5%%' THEN 1. Nach der Zeile, die Sie in formatter.py angeben, wird %% in eine einzige % umgewandelt.

+0

Das war es. Ich hätte das sehen sollen. Vielen Dank! – manisha

Verwandte Themen