Spark, Parquet: фильтр DataFrame после ошибки выброса столбца метки времени - PullRequest
0 голосов
/ 10 марта 2020

У меня проблема с Spark 2.4 и Parquet Files. Я читаю паркетные файлы из хранилища с помощью pyspark, а затем сохраняю их в Spark DataFrame. В определении Dataframe я вижу, что столбец TIMESTAMP имеет тип bigint. Но функция printSchema возвращает long для этого столбца. Это первое, что меня смущает.

>>> df = spark.read.parquet(store_path)
>>> df
DataFrame[NAME: string, CITY: string, TIMESTAMP: bigint]
>>> df.printSchema()
root
 |-- NAME: string (nullable = true)
 |-- CITY: string (nullable = true)
 |-- TIMESTAMP: long (nullable = true)

Цель состоит в том, чтобы фильтровать после столбца TIMESTAMP, который в настоящее время является отметкой времени unix в наносекундах. Поэтому у меня есть start_date и end_date.

>>> df = df.filter(col('TIMESTAMP').between(start_date, end_date))

Если я фильтрую, и между start_date и end_date есть запись, то все работает. Но если в этом таймфрейме нет записи, вместо того, чтобы возвращать пустой Dataframe, выдается следующая ошибка:

 java.lang.IllegalArgumentException: FilterPredicate column: insert_timestamp's declared type (java.lang.Long) does not match the schema found in file metadata. Column insert_timestamp is of type: INT96
Valid types for this column are: [class org.apache.parquet.io.api.Binary]

В результате я добавляю новый столбец с содержимым столбца TIMESTAMP, приведенным к метка времени. Затем я удаляю столбец TIMESTAMP.

>>> df = df.withColumn('tmp', from_unixtime(col("TIMESTAMP")/1000000000).cast("timestamp"))
>>> df = df.drop("TIMESTAMP")

Но фильтр все еще не работает, я получаю ту же ошибку, хотя в DataFrame больше нет столбца TIMESTAMP. Кто-нибудь знает, в чем может быть проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...