2017-05-07 1 views
1

Ich arbeite in Google BigQuery (nicht mit LegacySQL), und ich versuche derzeit, eine Zeichenfolge als float64() zu casten(). Jedes Mal bekomme ich den Fehler "Bad double value". Ich habe auch safe_cast() ausprobiert, aber es eliminiert einige meiner IDs komplett (Bsp .: wenn ein Kunde 3 mal für 3 verschiedene Daten wiederholt und nur 'Null' für einen einzelnen "Height" Eintrag hat, wird dieser Kunde komplett eliminiert Ich mache safe_cast(), nicht nur die Zeile, die den Wert 'null' hatte. Ich habe keinen seltsamen String-Wert in meinen Daten, nur ganze oder rationale Zahlen oder Null-Einträge."schlechter doppelter Wert" in Google BigQuery

Hier ist meine aktuellen Code:

select id, date,   
     cast(height as float64) as height,  
     cast(weight as float64) as weight 
from (select id, date, max(height) as height, max(weight) as weight 
     from table  
     group by 1,2 
    ) 
group by 1, 2 
+0

Wie sehen Größe und Gewicht (Strings) aus? Ich kann an problematische Strings denken; z.B. 'NaN' oder so genannte" subnormale "Doppelwerte (weniger als 1E-308), an denen BigQuery scheitern könnte. Ganz zu schweigen von Höhen-String-Werten wie "WIRKLICH TAL" :-) – Mischa

Antwort

3

Natürlich safe_cast() kehrt NULL Werte. Das liegt daran, dass Sie in den Daten unangemessene Werte haben.

Sie können diese, indem Sie finden:

select height, weight 
from table 
where safe_cast(height) is null or safe_cast(weight) is null; 

Wenn Sie verstehen, was die Werte sind, die Werte beheben oder die Logik der Abfrage einstellen.

Wenn Sie die max Werte nur wollen, sind richtig numerisch, dann vor der Aggregation Stimmen:

select id, date, 
     max(safe_cast(height as float64)) as height, 
     max(safe_cast(weight as float64)) as weight 
from table  
group by 1, 2; 

Eine Unterabfrage scheint nicht notwendig oder wünschenswert für Ihre Anfrage.

+0

safe_cast() gibt keine Nullwerte zurück, es eliminiert vollständig die Kundennummer in meinen Daten, wenn dieser Kunde einen Nullwert für einen Tag hatte. Bsp .: Wenn ein Kunde 3 Mal für 3 verschiedene Daten wiederholt und nur "Null" für einen "Höhe" -Eintrag hat, werden sie eliminiert, nachdem ich safe_cast() gemacht habe. Alle Einträge sind entweder ganze Zahlen oder rationale Zahlen (d. H. Nichts anderes als 'null'). – cheesetaco

+0

@ksitt. . . Wenn ich 'safe_cast()' in 'select' verwende, gibt es' NULL' zurück und filtert keine Werte - genau wie es dokumentiert ist. –