Фильтр искры Dataframe со спецификацией c литерал временной метки - PullRequest
0 голосов
/ 09 июля 2020
• 1000 фильтровать все записи, размер которых превышает ("01-Jan-2005 00.00.00.001 AM")

Все в строковом формате

Я пробовал разные способы, но результаты не совпадают, кажется, сравнивается строка. Вероятно, я столкнулся с проблемами при преобразовании литерала в метку времени и получении переменных результатов.

1 Ответ

1 голос
/ 09 июля 2020

вы не можете сравнить время, когда оно находится в строке. Pyspark предлагает API для преобразования строк в метку времени: https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=to_timestamp#pyspark. sql .functions.to_timestamp С его помощью вы сможете преобразовать свой столбец как dateType, а затем выполнять сравнения.

Попробуйте.

В вашем случае вы используете 12-часовой формат (чч), здесь допустимые значения 1-12 согласно SimpleDateFormat, который использует искра. Обратитесь к https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

Поэтому, если вам нужен 24-часовой формат, измените строку часа на HH

Поскольку вы даете 00 в hh, он становится недействительным. Приведенный ниже код работает. Также будьте осторожны с форматом, который вы указываете, и форматом строки. если есть несоответствие, то вы получите null.

import pyspark.sql.functions as F

tst=sqlContext.createDataFrame([('Ram','01-Jan-2000 01.00.00.001 AM'),('Tom','01-Jan-2020 11.00.00.001 AM'),('Ali',' 01-Jan-2010 07.00.00.001 AM')],schema=["Name","DOJ"])
tst1=tst.withColumn("ts",F.to_timestamp(F.col("DOJ"),format="dd-MMM-yyyy hh.mm.ss.SSS aa"))
#%%
tst2 =tst1.filter(F.col('ts')>F.to_timestamp(F.lit("01-Jan-2005 01.00.00.001 AM"),format="dd-MMM-yyyy hh.mm.ss.SSS aa"))

результаты:

|Name|DOJ                         |ts                 |
+----+----------------------------+-------------------+
|Tom |01-Jan-2020 11.00.00.001 AM |2020-01-01 11:00:00|
|Ali | 01-Jan-2010 07.00.00.001 AM|2010-01-01 07:00:00|
+----+----------------------------+-------------------+
...