2017-08-23 2 views
1

Ich habe einen Datenrahmen mit mehreren Spalten, von denen zwei vom Typ pyspark.sql.TimestampType sind. Ich möchte diesen Datenrahmen in Zeilen filtern, in denen der Zeitunterschied zwischen diesen beiden Spalten weniger als eine Stunde beträgt.Filter pyspark Dataframe basierend auf dem Zeitunterschied zwischen zwei Spalten

Ich versuche zur Zeit, dies zu tun, wie so: examples = data.filter((data.tstamp - data.date) < datetime.timedelta(hours=1))

Aber das schlägt mit der folgenden Fehlermeldung:

org.apache.spark.sql.AnalysisException: cannot resolve '(`tstamp` - `date`)' due to data type mismatch: '(`tstamp` - `date`)' requires (numeric or calendarinterval) type, not timestamp 

Was ist die richtige Methode, um diese Filter zu erreichen?

Antwort

1

Ihre Spalten haben verschiedene Arten, es ist schwierig zu interpretieren, was der Unterschied bedeutet, normalerweise für Zeitstempel ist es Sekunden und für Daten sind es Tage. Sie können beiden Spalten-Transformation in der Unix-Zeitstempel im Voraus einen Unterschied in Sekunden zu erhalten:

import pyspark.sql.functions as psf 
data.filter(
    psf.abs(psf.unix_timestamp(data.tstamp) - psf.unix_timestamp(data.date)) < 3600 
) 

EDIT

Diese Funktion auf Strings arbeiten (da sie eine korrekte Format haben), auf Zeitstempel und auf Termine:

import datetime 
data = hc.createDataFrame(sc.parallelize([[datetime.datetime(2017,1,2,1,1,1), datetime.date(2017,8,7)]]), ['tstamp', 'date']) 
data.printSchema() 
    root 
    |-- tstamp: timestamp (nullable = true) 
    |-- date: date (nullable = true) 

data.select(
    psf.unix_timestamp(data.tstamp).alias('tstamp'), psf.unix_timestamp(data.date).alias("date") 
).show() 
    +----------+----------+ 
    | tstamp|  date| 
    +----------+----------+ 
    |1483315261|1502056800| 
    +----------+----------+ 
+0

Die Spalten nicht unterschiedliche Typen sind, sondern beide Typ 'pyspark.sql.TimestampType' – vaerek

+0

Zusätzlich sind, sind diese DATETI Ich Objekte, so dass die 'unix_timestamp' Funktion nicht funktioniert, da es auf String-Eingabe arbeitet. Ich denke, ich könnte sie von Datum zu String umwandeln und sie dann durch 'unix_timestamp' laufen lassen. Ich frage mich, ob es einen einfacheren Weg gibt. – vaerek

+0

In pyspark haben wir nicht Zugriff auf alle Datetime-Funktionen von Python, die einzige andere Funktion für Zeitunterschiede ist datediff für Tage. Wenn Sie also keine UDF schreiben, die weniger effizient ist als eine reine Pyspark-Lösung, müssen Sie eine Zeitstempeldifferenz verwenden, indem Sie sie in "int" umwandeln. – MaFF

Verwandte Themen