Идентификатор раздела неявно преобразуется при чтении из s3 в spark / scala - PullRequest
1 голос
/ 25 сентября 2019

У меня есть исходные данные в s3, и мое приложение spark / scala прочитает эти данные и запишет их в виде паркетных файлов после разделения их на новый столбец partition_id.Значение partition_id будет получено путем взятия первых двух символов из другого столбца id, имеющего буквенно-цифровую строку.Например:

id = 2dedfdg34h, partition_id = 2d

После записи данных в s3 будут созданы отдельные папки разделов для каждого раздела, и все выглядит хорошо.Например:

PRE partition_id=2d/
PRE partition_id=01/
PRE partition_id=0e/
PRE partition_id=fg/
PRE partition_id=5f/
PRE partition_id=jk/
PRE partition_id=06/
PRE partition_id=07/

Но когда я снова читаю эти файлы s3 в кадре данных, такие значения, как 1d, 2d и т. Д., Преобразуются в 1.0, 2.0.

Версия Spark: 2.4.0

Пожалуйста, предложите, как избежать этого неявного преобразования.

Команда, используемая для записи и чтения секционированных данных в / из s3:

dataframe.write.partitionBy("partition_id").option("compression", "gzip").parquet(<path>)
spark.read.parquet(<path>)

1 Ответ

0 голосов
/ 26 сентября 2019

Проблема в том, что Spark ошибочно делает вывод, что тип столбца столбца раздела - это число.Это связано с тем, что некоторые значения actullay являются числами (Spark не просматривает их все).

Что вы можете сделать, чтобы избежать этого, просто отключить автоматический вывод типа столбцов раздела при чтенииданные.Это даст вам исходные строковые значения по желанию.Это можно сделать следующим образом:

spark.conf.set("spark.sql.sources.partitionColumnTypeInference.enabled", "false")
...