У меня проблема с 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. Кто-нибудь знает, в чем может быть проблема?