2017-12-19 1 views
0

Dies ist, wie meine CSV-Daten wie folgt aussieht:

TagNumber,DatePaid,TotalPaid 
ABCD,11/5/2017,$101 
EFGH,12/5/2017,$201 
ABCD,15/5/2017,$501 

ich einen Datenrahmen bin zu schaffen, wird Gruppe die Daten von TagNumber, erhalten Min und Max von DatePaid und Summe TotalPaid . Diese

ist, wie ich bin die Schaffung Datenrahmen

valid_data = valid_data.select('TagNumber', from_unixtime(unix_timestamp('DatePaid', 'MM/dd/yyy')).alias('m_paiddDate'), "TotalPaid")\ 
     .groupBy("TagNumber") \ 
     .agg(F.min("DatePaid").alias("min_date"), F.max("DatePaid").alias("max_date"), F.count("TagNumber").alias("no_of_times_paid")) \ 
     .orderBy("no_of_times_paid", ascending=False) 

Wenn ich F.sum("TotalPaid").alias("Total_Paid") in den Aggregator, ich leere Werte für Total_Paid Spalte erhalten, wie es aufgrund $ Zeichen als String behandelt wird.

Wie bekomme ich sum für TotalPaid Spalte?

Antwort

1

so etwas wie dieses Versuchen TotalPaid auf einen numerischen Wert umgewandelt (zuerst die $ mit regulären Ausdrücken entfernen, dann cast):

valid_data = valid_data.withColumn(
    'TotalPaid', F.regexp_replace('TotalPaid','\$', '').cast('float') 
) 
+0

Ich bin nicht einverstanden, was, wenn Ihr Geldbeträge Cent enthalten? In jedem Fall funktioniert die grundlegende Methodik, der Datentyp für die Besetzung kann nach Bedarf geändert werden – ags29

+0

Um finanzielle Daten darzustellen, sollten Sie immer Zahlen mit fester Genauigkeit verwenden (d. H. 'DecimalType'), niemals Gleitkommazahlen. – user8371915

Verwandte Themen