Was ist die richtige Methode zum Filtern von Datenrahmen nach Zeitstempel Feld?datetime Bereich Filter in PySpark SQL
ich unterschiedliche Datumsformate und Formen der Filterung versucht haben, nichts hilft: entweder pyspark liefert 0 Objekte oder einen Fehler wirft, dass es nicht Datetime-Format
Hier versteht ist, was ich so weit gekommen:
from pyspark import SparkContext
from pyspark.sql import SQLContext
from django.utils import timezone
from django.conf import settings
from myapp.models import Collection
sc = SparkContext("local", "DjangoApp")
sqlc = SQLContext(sc)
url = "jdbc:postgresql://%(HOST)s/%(NAME)s?user=%(USER)s&password=%(PASSWORD)s" % settings.DATABASES['default']
sf = sqlc.load(source="jdbc", url=url, dbtable='myapp_collection')
Bereich für die Zeitstempel-Feld:
system_tz = timezone.pytz.timezone(settings.TIME_ZONE)
date_from = datetime.datetime(2014, 4, 16, 18, 30, 0, 0, tzinfo=system_tz)
date_to = datetime.datetime(2015, 6, 15, 18, 11, 59, 999999, tzinfo=system_tz)
Versuch 1
date_filter = "my_col >= '%s' AND my_col <= '%s'" % (
date_from.isoformat(), date_to.isoformat()
)
sf = sf.filter(date_filter)
sf.count()
Out[12]: 0
Versuch 2
sf = sf.filter(sf.my_col >= date_from).filter(sf.my_col <= date_to)
sf.count()
---------------------------------------------------------------------------
Py4JJavaError: An error occurred while calling o63.count.
: org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 4.0 failed 1 times, most recent failure:
Lost task 0.0 in stage 4.0 (TID 3, localhost): org.postgresql.util.PSQLException:
ERROR: syntax error at or near "18"
#
# ups.. JDBC doesn't understand 24h time format??
Versuch 3
sf = sf.filter("my_col BETWEEN '%s' AND '%s'" % \
(date_from.isoformat(), date_to.isoformat())
)
---------------------------------------------------------------------------
Py4JJavaError: An error occurred while calling o97.count.
: org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 17.0 failed 1 times, most recent failure:
Lost task 0.0 in stage 17.0 (TID 13, localhost): org.postgresql.util.PSQLException:
ERROR: syntax error at or near "18"
die Daten in der Tabelle existieren, aber:
django_filters = {
'my_col__gte': date_from,
'my_col__lte': date_to
}
Collection.objects.filter(**django_filters).count()
Out[17]: 1093436
Oder diese Weise
django_range_filter = {'my_col__range': (date_from, date_to)}
Collection.objects.filter(**django_range_filter).count()
Out[19]: 1093436
die erste Lösung funktioniert, vielen Dank! – funkifunki
Die zweite Lösung schlägt mit Fehler fehl: Py4JJavaError: Beim Aufruf von o32.filter ist ein Fehler aufgetreten. : java.util.NoSuchElementException: Schlüssel nicht gefunden: unix_timestamp es ist kein Problem, obwohl wahrscheinlich durch meine spezifische Einrichtung verursacht – funkifunki
Es ist möglich. Soweit es mich betrifft, ist 'unix_timestamp' Teil von Hive UDFs. – zero323